使用Go-Ethereum搭建以太坊私有链
发一篇技术文章,之前从网上找了好多教程(没有一个是完整的),安装过程中遇到不少问题,记录一下。
一、安装
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth
make all
二、运行
mkdir chain
geth --datadir "./chain" -dev -dev.period 1 --nodiscover console 2>>eth_output.log
三、使用
查看账户
> eth.accounts
创建账户
> personal.newAccount("123456")
查看余额
> web3.eth.getBalance("0xbe323cc4fde114269a9513a27d3e985f82b9e25d")
或者
> acc0 = eth.accounts[0]
> eth.getBalance(acc0)
查看格式化的以太币
> web3.fromWei(web3.eth.getBalance(acc0))
挖矿
> miner.start()
> miner.stop()
查看全部账户余额
> function checkAllBalances() {
var totalBal = 0;
for (var acctNum in eth.accounts) {
var acct = eth.accounts[acctNum];
var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
totalBal += parseFloat(acctBal);
console.log(" eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether");
}
console.log(" Total balance: " + totalBal + " ether");
};
> checkAllBalances()
或者保存到一个脚本里,然后加载运行
> loadScript('/path/script/here.js')
> checkAllBalances()
转账
> web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
四、问题
1. 转账失败
a. 账号被锁
当直接执行此方法时会抛出异常,显示帐号被锁
> web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
Error: authentication needed: password or unlock
at web3.js:3104:20
at web3.js:6191:15
at web3.js:5004:36
at <anonymous>:1:1
解锁转帐帐户
> web3.personal.unlockAccount(acc0,"123456")
b. 未挖矿
可能未运行挖矿
> miner.start()
2. miner.start()返回null
a. 是否设置miner地址
查看当前节点下面是否有账号存在
> personal.listAccounts
当确认账户已经存在时,可以设置Etherbase。先查看以下coinbase账户
> eth.coinbase
执行设置miner地址
> miner.setEtherbase(eth.coinbase)
或者
> miner.setEtherbase(eth.accounts[0])
b. 节点误报
另外一种情况就是其实miner.start()命令已经执行成功,只不过节点返回null。如果是dev模式,可以使用eth.blockNumber查看一下区块高度是否增加。
c. 节点版本问题
出现此问题的原因在于geth版本更新之后,–dev模式下新增了一个参数项:
--dev Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled
--dev.period value Block period to use in developer mode (0 = mine only if transaction pending) (default: 0)
–dev是我们常用的参数,之前版本中我们只用使用–dev然后执行miner.start()就可以挖矿,但是在后面的版本中,当我们会发现只有发送交易了才会挖一个块。
引起此问题的原因就是新增了–dev.period value配置项。此配置默认值为0,也就是说只有有pending中的交易才会挖矿。
明白了这个参数的含义之后,解决问题就很简答了,之前的–dev参数依旧使用,然后再在后面添加–dev.period 1,注意,参数值为1,不是默认的0。
再重新启动节点,然后执行挖矿,先不管返回是否是null,执行之后,无论查看日志或执行eth.blockNumber都会发现块在不停的增高。
新年快乐!cn区点赞机器人 @cnbuddy 谢谢你对cn区的贡献。如果不想再收到我的留言,请回复“取消”。