连接到其他节点
所有的节点创建都是一样的。
创建节点二:
geth --datadir data1 init genesis.json
启动节点二
geth --identity "TestNode2" --datadir "data1" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "127.0.0.1" --ipcpath "data1\geth\geth.ipc" --rpcport "8487" --port "30305" --networkid "29382" console
3. 给新节点创建一个账户,否则无法启动挖矿
>personal.newAccout(“123”)
连接节点:
可以通过 admin.addPeer() 方法连接到其他节点,两个节点要要指定相同的 chainID。
假设有两个节点:节点一和节点二,chainID 都是 29382 ,通过下面的步骤就可以从节点一连接到节点二。
首先要知道节点二的 enode 信息,在节点二的 JavaScript console 中执行下面的命令查看 enode 信息:
>admin.nodeInfo.enode
"enode://0ce4dc3066664bd2de57bd5c9eec8e002d21079c133394884517f5a8c24e77ef6ef3c80eb9ad628e3b93a114d7db638e8b16c60198ed703912cb9700f8ddba1a@192.168.1.3:30305"
>
注意:此处不能使用显示的IP,需要用启动私有链时候指定的IP(127.0.0.1)才行
然后在节点一的 JavaScript console 中执行 admin.addPeer(),就可以连接到节点二:
>admin.addPeer("enode://0ce4dc3066664bd2de57bd5c9eec8e002d21079c133394884517f5a8c24e77ef6ef3c80eb9ad628e3b93a114d7db638e8b16c60198ed703912cb9700f8ddba1a@127.0.0.1:30305")
true
>
addPeer() 的参数就是节点二的 enode 信息,注意要把 enode 中的 [::] 替换成节点二的 IP 地址。连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
挖矿的时候,哪个节点的矿工启动了,它的账户就会增加eth,链块数据会同步到其他节点。
同时开两个命令行工具可以看到两个工具同时在进行链块同步。
>eth.blockNumber 查阅两个节点的块个数,是一样的,完成同步
通过 admin.peers 可以查看连接到的其他节点信息,通过 net.peerCount 可以查看已连接到的节点数量。
除了上面的方法,也可以在启动节点的时候指定 --bootnodes 选项连接到其他节点。
注意:
1、对于操作过程中存在的问题网上基本上都有解决方法,可以参考错误信息自己解决
2、如果使用的服务器或者虚拟机需要注意防火墙和端口的配置
上面转账动作发生在同一个节点内,下面完成跨节点的账户转账动作。
在节点二而新建账户:
>personal.newAccount("123456")
"0x9b78c5766ddbb55c4414ff5f441b4cea0c7a72a4"
查询新账户余额
>eth.getBalance("0x9b78c5766ddbb55c4414ff5f441b4cea0c7a72a4")
0
在节点一的accounts[0]向外给节点二的账户转5个。
转账之前的余额
> eth.getBalance(eth.accounts[0])
370000000000000000000
解锁账户
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x781ea3fbf05476db5d259c833347705d6ca770f2
Passphrase:
true
定义5个ether
> amount = web3.toWei(5,'ether')
"5000000000000000000"
转账给节点二
>eth.sendTransaction({from:eth.accounts[0],to:"0x9b78c5766ddbb55c4414ff5f441b4cea0c7a72a4", value:amount})
INFO [07-31|12:48:20.509] Submitted transaction fullhash=0x298d16ec44cdfe0df81a73fd14c1d649789e3d6ce6806bbae50bc021654b5180 recipient=0x9b78C5766DdbB55C4414ff5F441B4cEa0C7a72a4"0x298d16ec44cdfe0df81a73fd14c1d649789e3d6ce6806bbae50bc021654b5180"
没有矿工工作,数据仍然在交易池中卫待确认交易,需要启动矿工,在哪个节点启动都可以。本例在节点二中启动。
> eth.getBalance(eth.accounts[0])
370000000000000000000
节点而启动矿工以后,自动同步到节点一的新区块数据
> INFO [07-31|12:48:43.918] Imported new chain segment blocks=1 txs=1 mgas=0.021 elapsed=5.004ms mgasps=4.197 number=87 hash=1026c6…285caa cache=21.65kB
INFO [07-31|12:48:44.843] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=4.002ms mgasps=0.000 number=88 hash=1b3798…934171 cache=22.04kB
INFO [07-31|12:48:45.009] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=6.004ms mgasps=0.000 number=89 hash=68059b…dff0ae cache=22.43kB
INFO [07-31|12:48:47.123] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=5.004ms mgasps=0.000 number=90 hash=a8cf3e…7a64ba cache=22.83kB
查询节点一的账户余额,已经减少,
> eth.getBalance(eth.accounts[0])
364999622000000000000
同时节点二的余额已经增加。
注意:
每个节点可以管理多个账户。
账户之间余额也是相互独立的
总结:
到目前为止,大家应该对以太坊如何转账有了清楚的了解,本教程是基于同一条私链的两个节点之间进行的转账。转账过程中有几点需要注意:
(1)两节点要加入同一条私链,即这两个节点初始化的创世区块必须要一模一样。
(2)两个节点转账前,需要确定两个节点之间的网络是否能够互通。
(3)A节点在添加B节点的enode字符串时需要手动将enode字符串中的ip地址设为B节点的IP地址,因为命令admin.nodeInfo获取的enode字符串中ip地址不一定是正确的。
(4)想要实现转账,私链网络中至少要有一个节点在挖矿。
(5)以太坊api中输入的最小单位都是wei,1ether=1000000000000000000wei。
至此我们的节点钱包里有不少eth,可惜是私有链上的。