Ethereum 就是以太坊,以太坊有各种语言的客户端,其中最为成熟的就是go语言和Ruby的客户端,其中go客户端称为go-Ethereum,简称geth
geth有windows版本和linux版本,官方网站还是比较慢的,卡的根本下载不了,这里选择了国内的wIndows镜像
镜像地址:https://ethfans.org/wikis/Ethereum-Geth-Mirror
下载好windons的镜像geth-windows-amd64-1.8.3-329ac18e.exe后,然后开始安装,这玩意直接点点点,很快就好。
安装完成后就只有两个exe,然后你需要新建一个文件夹privatechain,随意起名,这文件夹里以后包含的就是私有链的数据。
由于最开始需要配置第一个区块,所以还需要再建一个genesis.json的创世块的文件,文件如下:
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
这个是官方的例子,但是这里修改了一个config.chainId,官方给出的是0.这里修改了为10。
在私有链中,chainId = 0 有可能会造成一些错误。
参数解释:
coinbase 矿工的账号
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
extraData 附加信息,随便填
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
nonce 就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
timestamp 设置创世块的时间戳
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号
接下来对privatechain进行初始化,cd到当前文件夹执行cmd命令:
geth --datadir "D:\eth\PrivateChain" init "D:\eth\genesis.json"
初始化完成,privatechain文件夹里新增加了内容,然后启动geth
geth --datadir "D:\eth\PrivateChain" --port 30303 --networkid 10 --nodiscover console
这个已经启动成功了,可以看到我们接着进入到了geth控制台,可以进一步输入一些命令了。
personal.listAccounts 会出现[],表示还没有账号
personal.newAccount("123") 输入密码创建账号
我们可以看到输入123,就创建得到了地址。但是同一个密码接着创建又得到了不同的地址。这是因为私钥及地址的创建跟密码实在是没有多大关系,只是施加了稍微一些不同的影响。
此时我们现在有两个地址了。
我们来查下第一个地址的余额
eth.getBalance(eth.accounts[0])
或者
eth.getBalance("0x2b2a162a9a8ca0ee8a3ac2650e71401ca839db25")
查询发现都是0
接下来
开始挖矿:miner.start();
停止挖矿miner.stop()
挖矿时挖来的钱默认的是放到了创建的第一个账号的地址,注意首次挖矿之前需要加载一些东西到100%,会比较慢。
停止成功后会返回 true
然后我们可以再次查询eth.getBalance(eth.accounts[0]),会发现第一个账户钱就很多了。
转账:
在转账之前需要暂时解锁转出账户,否则会报错(在真实生产中有多种方法可以进行转账,本次只演示这一个):
personal.unlockAccount(eth.accounts[0]),这个操作只能解锁300秒好像,300秒后还必须再次解锁。
紧接着我们账户1向账户2转账了1
eth.sendTransaction({from:eth.accounts[0] to:eth.accounts[1], value:1})
你敲了上行命令后再次查询余额时发现没有变,为什么呢?
这是因为转账这个操作在私有链里必须得挖矿才能实际上转入,所以开始挖矿去miner.start();
然后再次查询或者停止挖矿后查询就会发现已经转入成功了。有的同学可能发现还没有成功,不要急,接着挖,过会儿就转账了。