etherem创世块的创建、创建账户以及账户间的建立通道

来源:互联网 发布:手机屏幕动物软件 编辑:程序博客网 时间:2024/04/25 02:42

系统为Ubuntu16.10

1、新建文件ethereum,并新建配置文件test.json如下:

{
    "config":{
            "chainid":22,
            "hometestBlock":0,
                    "eip155Block":0,
                    "eip158Block":0
        },
    "nonce"     :"0x0000000000000038",
    "timestamp"  :"0x0",
    "parentHash" :"0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit"  :"0x2fefd80",
    "difficulty" :"0x400",
    "mixhash"     :"0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0xbe8d5fce9f60ab06b527dd177eed96eb95ee4138",
    "alloc"     :{},
     "extraData " :""
   
}
2、在ethereum下新建文件夹data0:
终端位于ethereum中:geth --datadir data0 init test.json
此处表示新建创世块,区块链的第一块已经生成。


3、启动私有链:geth --datadir data0 --networkid 1108 console,之后会进入一个交互界面。

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

4、新建账户:personal.newAccount()

注:查看账户:eth.accounts

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

默认挖到存储默认账户:eth.coinbase;

设置默认账户:miner.setEtherbase(eth.accounts[1])


6、查看余额:eth.getBalance(eth.accounts[0])

getBalance()返回值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币:

换算为以太币:web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')


7、转账:
> amount = web3.toWei(5,'ether')
"5000000000000000000"

> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

8、解锁账户:personal.unlockAccount(eth.accounts[0])

9、验证是否承认转账:此时交易已经提交到区块链,返回了交易的hash,但还未被处理,这可以通过查看txpool来验证,

txpool.status


其中有一条pending的交易,pending表示已提交但还未被处理的交易。
要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿
miner.start(1);admin.sleepBlocks(1);miner.stop();

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




10、查看交易和区块:

查看当前区块总数:
> eth.blockNumber

通过交易hash查看交易:
> eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")

通过区块号查看区块:
> eth.getBlock(33)



11、链接到其他节点:可以通过admin.addPeer()方法连接到其他节点,两个节点要想联通,必须保证网络是相通的,并且要指定相同的networkid。
假设有两个节点:节点一和节点二,networkid都是1108,通过下面的步骤就可以从节点一连接到节点二。首先要知道节点二的enode信息,
在节点二的js console中执行下面的命令查看enode信息:
> admin.nodeInfo.enode
"enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@[::]:30304"
然后在节点一的js console中执行admin.addPeer(),就可以连接到节点二:

> admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@127.0.0.1:30304")
addPeer()的参数就是节点二的enode信息,注意要把enode中的[::]替换成节点二的IP地址。连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
通过admin.peers可以查看连接到的其他节点信息,通过net.peerCount可以查看已连接到的节点数量。
除了上面的方法,也可以在启动节点的时候指定--bootnodes选项连接到其他节点。


最后一步由于没有在同一个配置文件下生成不同的节点,导致没有成功,所以未能截图。

本文参考自:http://dophin459.coding.me/posts/e47700bb/