如何搭建以太坊的私有链

首先进入到这个Mychains目录中,执行初始化命令

 


cd Mychains
geth --datadir data0 init genesis.json
上面命令的主体是geth init ,表示初始化区块链,命令可以带有选项和参数,其中--datadir选项后面跟着一个目录名,这里面为data0,表示后面指定的数据存放的目录为data0,genesis.json是init命令的参数
运行上面的命令,会读取genesis.json(传世区块),根据其中的内容,将传世区块写入到区块链中,如果看到log信息中有 Successfully wrote genesis state ,则说明初始化成功

其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。


启动私有链节点
初始化完成后,就有了一条自己的私有链,之后就可以启动自己的私有链节点并做一些操作,在终端中输入以下命令即可启动节点:

geth --datadir data0 --networkid 1108 console
上面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是1108,表示指定这个私有链的网络id为1108。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id(上面命令可能会运行失败,我直接重启mac,再进入到privateChain目录中,简单粗暴)。


运行上面的命令后,就启动了区块链节点并进入了Javascript Console:


这是一个交互式的Javascript执行环境,在这里面可以执行Javascript代码,其中>是命令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript对象,可以直接使用这些对象。这些对象主要包括:

eth:包含一些跟操作区块链相关的方法
net:包含以下查看p2p网络状态的方法
admin:包含一些与管理节点相关的方法
miner:包含启动&停止挖矿的一些方法
personal:主要包含一些管理账户的方法
txpool:包含一些查看交易内存池的方法
web3:包含了以上对象,还包含一些单位换算的方法

 


查看私有链里面有没有自己的账户
> eth.accounts
[]

此时没有账户,接下来使用personal对象来创建一个账户
Passphrase其实就是密码的意思,输入两次密码后,就创建了一个账户。再次执行命令:重复两次创建两个账户
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x259ab3438cbc45395c907963ce02f702b22d5ac8"
>

此时再去看账户就存在了两个账户
> eth.accounts
["0x259ab3438cbc45395c907963ce02f702b22d5ac8"]

账户默认会保存在数据目录的keystore文件夹中。查看目录结构,发现data0/keystore中多了两个文件,这两个文件就对应刚才创建的两个账户,这是json格式的文本文件,可以打开查看,里面存的是私钥经过密码加密后的信息。

eth对象提供了查看账户余额的方法:
> eth.getBalance(eth.accounts[0])查看的是第一个账户的余额
0
> eth.getBalance(eth.accounts[1])查看的是第二个账户的余额
0

目前两个账户的以太币余额都是0,要使账户有余额,可以从其他账户转账过来,或者通过挖矿来获得以太币奖励。

 


启动&停止挖矿
通过miner.start()来启动挖矿:

> miner.start(10)
其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

如果想停止挖矿,并且进度已经达到100%之后,可以在js console中输入

miner.stop():


miner.start(10)开始10个线程
start的参数表示的挖矿所使用的线程数,第一次启动挖矿会生成所需要的挖矿的DAG文件,这个过程有点慢,当进度达到100%的时候。就会开始挖矿,此时屏幕会被挖矿信息刷屏,如果想停止挖矿,并且在进度到100%的时候,可以再控制台中输入miner.stop()

注意:输入的字符会被刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,就可以体质挖矿

挖到第一个区块之后会奖励5个以太币,挖矿所得到的奖励会进入到矿工的账户中,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户

eth.coinbase默认挖矿所得到的放入第一个账户中:

现在的coinbase的账户是0,要想使挖矿奖励放入其他账户中,可以通过miner.setEtherbase()将其他账户设置为coinbase即可
> miner.setEtherbase(eth.accounts[1])设置coinbase为账户1
true
> eth.coinbase
"0x528ae340112a80de3ca4cee097c023dea24ede85"

挖到区块之后,账户0应该有余额了
> eth.getBalance(eth.accounts[0])
650000000000000000000

getBalance()返回值的单位是wei,wei是以太币的最小单位,一个以太币=10的18次方个wei,要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
650


可以通过发送一笔交易,从账户0转移10个以太币到账户1:
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
Error: authentication needed: password or unlock
at web3.js:3143:20
at web3.js:6347:15
at web3.js:5081:36
at <anonymous>:1:1

>


这里报错了,原因是账户每隔一段时间就会被锁住,要发送交易,就必须要先解锁账户,由于我们从账户0发送交易,所以要解锁账户0
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x259ab3438cbc45395c907963ce02f702b22d5ac8
Passphrase:
true
>
解锁账户0成功,输入的是之前创建账户时设置的密码,就可以解锁成功,然后在发送交易


> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
INFO [04-02|02:00:02.565] Setting new local account address=0x259ab3438cbC45395C907963CE02f702B22D5ac8
INFO [04-02|02:00:02.572] Submitted transaction fullhash=0xc1c91f3e9d1dc03789408512bf95227085d4dd7bc3da15ace410c25ff10a7bc9 recipient=0x528aE340112A80DE3Ca4CEE097C023DEA24ede85
"0xc1c91f3e9d1dc03789408512bf95227085d4dd7bc3da15ace410c25ff10a7bc9"

 

我们去查看账户1中的余额:

> eth.getBalance(eth.accounts[1])
0
发现还没转过去,此时交易已经提交到区块链,但还未被处理,这可以通过查看txpool来验证:

> txpool.status
{
pending: 1,
queued: 0
}
>

在区块链中等待被处理的状态,其中有一条pending的交易,pending表示已提交但还未被处理的交易。
要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:


miner.start(1);admin.sleepBlocks(1);miner.stop();

当miner.stop()返回true后,txpool中pending的交易数量应该为0了,说明交易已经被处理了,而账户1应该收到币了:

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
10

> txpool.status
{
pending: 0,
queued: 0
}
>
此时的pedding的状态也为0了,已经处理完毕了


eth对象封装了查看交易和区块信息的方法。

查看当前区块总数

> eth.blockNumber
138

通过区块号查看区块
> eth.getBlock(32)
{
difficulty: 132928,
extraData: "0xda83010817846765746888676f312e31312e358777696e646f7773",
gasLimit: 130086343,
gasUsed: 0,
hash: "0x1031bea90c9b00acff1c9811feedd88c4c783f53619a418297bcf53e938ae586",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x259ab3438cbc45395c907963ce02f702b22d5ac8",
mixHash: "0xd17858d584c0a38c01f41240addc5a43115216c701cebac8ee78fdfa94ce9801",
nonce: "0x64f8bf8de6f36ebc",
number: 32,
parentHash: "0x7aaba62e3d27c963fc4fdb962f44ab5be7ef50490f7ff0a84645e8a7afea369e",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 539,
stateRoot: "0xf1d3d95f619d7af088aaf4147f2b611f768ea91ce990404943b5d8ada9f05a3c",
timestamp: 1554140288,
totalDifficulty: 4223552,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
> eth.getBlock(320)
null
>

通过交易hash查看交易:

> eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6")
{
blockHash: "0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a",
blockNumber: 463,
from: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
gas: 90000,
gasPrice: 18000000000,
hash: "0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6",
input: "0x",
nonce: 0,
r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",
s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",
to: "0x46b24d04105551498587e3c6ce2c3341d5988938",
transactionIndex: 0,
v: "0x38",
value: 10000000000000000000
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-04-02 02:15  风不再来  阅读(817)  评论(0编辑  收藏  举报