安装

geth 直接去下载安装就好,下载界面要加载好久才会出来 🤪
我下载的版本:曲奇云盘

geth 的操作及相关说明

连接至网络

使用这条命令主网
geth --datadir ./ethdev/chain --networkid 1

搭建私有链

把之前生成的那个 chaindata 删掉,然后在 ethdev 目录下创建一个 genesis.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"config": {
"chainId": 2,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x40000",
"extraDate": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00",
"alloc": {}
}

然后使用 geth init ./ethdev/genesis.json --datadir ./ethdev/chain 生成创世块,现在网络就部署好了,但是还没有区块和账户

image.png
image.png

运行命令:
geth --datadir ./ethdev/chain/00 --nodiscover console 2>>./ethdev/chain/00/eth_output.log
实际上上面这条命令的完整形式是这样的:geth --identity chainpi --rpc --rpcport 8080 --rpccorsdomain "*" --datadir ./ethdev/chain/00/ --port 30303 --nodiscover --rpcapi "db,eth,net,web3" --networkid 555 console 2>>./ethdev/chain/00/eth_output.log --allow-insecure-unlock

参数介绍:
–identity 给以太坊节点设置身份
–rpc 启动 RPC(Remote Procedure Call,远程过程调用)通信,进行智能合约的部署和调试。不同的 RPC 设置,可以供 API 及远程访问他们的人使用
–datadir 与初始化测试使用同一目录
–port 网络监听端口,设置端口是为了防止在多条链之间发生端口冲突
–nodiscover 表示该节点对外不可见
–networkid 是一个数字,表示设置当前区块链的网络 ID,以区分不同的网络,第一次可以随意设置,但之后如果要链接同一条链,需要去取对应的 networkid(主网 ID 为 1,主网的测试网络 ID 为 2)
–rpcapi “db,eth,net,web3” 这条命令主要是描述哪些接口可以通过 RPC 来访问,在默认情况下,geth 开启的是 web3 接口
–dev 启用开发者网络(模式)开发者模式会使用 POA 共识,默认预分配一个开发者账户,并会自动开启挖矿
–allow-insecure-unlock 是新版的 geth 禁用了 HTTP 通道解锁账户,加上这个东西就可以 unlock 了

image.png
image.png

控制台是一个交互的 javascript 执行环境,这个环境内置了一些用于操作以太坊的 JavaScript 对象

常见操作

eth.accounts 查看现有账户
personal.newAccount() 创建账户,括号里面可以填写密码,第一个创建的账户用户名默认 coinbase
账户数据保存在区块目录下的 keystore 文件夹里面

image.png
image.png

eth.coinbase(好像返回的是 hash)
eth.getBalance(eth.coinbase) 查看 coinbase 账户的余额
miner.start() 开始挖矿,挖到的以太币归默认 eth.accounts[0] 即 coinbase 所有,在测试网络里面,把 genesis.json 中的 difficulty 的值设置的小一点会更容易挖到以太币
eth.blockNumber 查看当前区块数(一开始显示为零,等会就有了)

image.png
image.png
image.png
image.png

miner.stop() 停止挖矿
eth.getBalance(eth.coinbase) 查看 coinbase 当前的余额

image.png
image.png

web3.fromWei(eth.getBalance(eth.coinbase),”ether”) 以以太币的形式显示余额

image.png
image.png

u0=eth.coinbase 重命名账户

personal.newAccount() 创建第二个账户
personal.newAccount() 创建第三个账户
u1=eth.accounts[1]
u2=eth.accounts[2]

image.png
image.png

开始交易

从 u0 转 100 个以太币给 u1,报错了,原因是 coinbase 未解锁
eth.sendTransaction({from:u0,to:u1,value:web3.toWei(100,'ether')})

image.png
image.png

personal.unlockAccount(u0,'123456') 解锁 u0 后面跟的 123456 是密码,解锁后就交易成功了

image.png
image.png

再给 u2 转 100 个
eth.sendTransaction({from:u0,to:u2,value:web3.toWei(100,'ether')})

image.png
image.png

交易完成之后并没有变化,使用 txpool.status 看一下

image.png
image.png

pending 为 2 表示有两笔交易已经提交,但未被处理,因为刚刚的交易还没有被写进区块,而将交易写进区块的办法是挖矿 ⛏
**

image.png
image.png

我们可以通过交易的散列值来查看之前达成的一笔交易

image.png
image.png

看一下对应的区块 eth.getBlock(209)

image.png
image.png

账户与密钥

理解一下他们的概念

账户

账户在以太坊中扮演着重要的角色,以太坊有两种账户类型,分别是外部账户和合约账户。在这里,外部账户简称为账户,合约账户简称为合约,外部账户和合约账户都是账户的通用概念,这些账户其实都是状态对象

外部账户的余额,就是外部账户的一个状态对象;合约账户的状态,除了余额,还有存储合约。所有账户的状态都是以太坊网络的状态,以太坊网络的状态随着每一个区块的更新而变化。
如果对以太坊网络加以限制,使其中只有外部账户且这些账户只能进行交易,就相当于生成了一种只能交易以太币的“山寨币”

账户是使用者对外的身份。在使用公玥对一笔交易进行签名后,以太坊虚拟机就可以安全地对这笔交易的发起者进行身份验证

每个账户都对应一对密钥,一个私玥和一个公玥
账户和地址是一一对应的,账户索引来自密钥的最后 20 字节
每一个私钥-地址都被编码到一个与密钥文件里面,密钥文件大小是一个 JSON 格式的文本文件
密钥文件的重要组成部分,即账户的私钥,是通过创建账户时输入的密码加密保护的
密钥文件存储在以太坊客户端的 keystore 的目录中,要定期备份

搭建私有链多节点

net 查看网络状态
net. 然后 tab 键可以看一下 net 可以进行哪些操作
net.listening 查看网络是否处于监听状态
net.peerCount 查看已连接的结点的数量
admin 查看网络
admin. 查看 admin 可以进行哪些操作

image.png
image.png

书上不详细,差评,参考:https://blog.csdn.net/hantangduhey/article/details/81017602

新开一个节点,这里我又设置了一下,把这些节点移动到了 chain 下面
geth init ./ethdev/genesis.json --datadir ./ethdev/chain/01

进入另一个的控制台:
geth --identity chainpi --rpc --rpcport 8081 --rpccorsdomain "*" --datadir ./ethdev/chain/01 --port 30304 --nodiscover --rpcapi "db,eth,net,web3" --networkid 555 console 2>>./ethdev/chain/01/eth_output.log --allow-insecure-unlock --ipcdisable
win 下面好像不加后面的参数 --ipcdisable 不能多开 geth

进入另一个节点一的控制台(就是之前一直用的那个控制台)运行如下命令,与节点二连接
admin.addPeer("enode://928acba0da90d952b3802f7ddab2a99d29164934c407b56f8c47ed52d44e843314457a40e9ff1dd5d2da632b5be6f8d346fddac35b9f2755650a17ed78a2e139@127.0.0.1:30304")

连接成功之后,节点二就会开始同步节点一的区块。同步完成之后只要任意节点开始挖矿,另一节点就会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该交易的信息,我这里不会显示
使用 net.peerCount 可以看一下已连接的节点数

image.png
image.png

当然,除了在控制台用命令添加,也可以在 –datadir 指定的目录里面添加 static-nodes.json 文件,让各个节点取得联系,具体如下:

1
2
3
{
"enode://xxxxxxxx" //boot node 的地址
}

Ethereum Wallet

这里下载,我最新版的有问题,下了个稍微老一点的版本 😋 曲奇云盘

下下来直接解压出来:先 cmd 中启动节点,然后再打开这个

image.png
image.png

第一次运行要等一阵,我去吃了个饭,也不知道要具体等多长时间,谈这个下载的框直接关掉

image.png
image.png

然后就这样了

image.png
image.png

出现这个的时候,点运行就可以

image.png
image.png

主界面!

image.png
image.png

使用 Mist 实现多重签名

多重签名是指需要多个人同意,交易才能生效。好处是当要从账户里提取较大额度的以太币时,需要多个账户共同认证才能成功提取,因此创建一个多重签名的钱包需要至少创建两个账户

另外,要想主账户添加不少于 0.02 个以太币(用于创建多重签名钱包的账户),这是创建多重签名钱包合约的交易费用,另外至少需要 1 个以太币,因为当前 Mist 需要足够的 gas 来确保多重签名合约能够正确地执行交易,所以一开始主账户里面至少要有 1.02 个以太币

随便点一个

image.png
image.png

选择右边的 copy address

image.png
image.png

把那俩的地址都保存出来:
0xE2fA80E6D74b9f63157EcD131Eb11F8130D0416D
0x27EdE661c026b64DdEF9d9D965d710af40afaea0

点击 Wallet Contracts

image.png
image.png

设置一下

image.png
image.png

然后创建

image.png
image.png

然后可以自己设置一下最高交易费用,输入密码就可以了
只有在挖矿状态下才能将合约打包到区块中

image.png
image.png

使用我们自己的账户,给刚才创建的钱包转个帐

image.png
image.png

如果转账的金币不够的话就会有提示

image.png
image.png

正常的话就正常转账

image.png
image.png