话说在最前,区块链是P2P的,因此没有谁是主服务器,每个点都是平等的。
自己动手搭建以太坊开发环境,可能版本也比较多,总没有一个能成功到底的,所以自己写了一个。
参考文献:
https://blog.csdn.net/weixin_34402090/article/details/91700963
1、Geth安装
主要讲解Windows 环境下的Geth安装,下载Windows-Geth安装包直接安装即可:
https://geth.ethereum.org/downloads/
不知道为什么有个遮罩层,用F12,display=none去掉,就可以点击了
下载后双击安装,安装完成后Geth会自己配置环境变量,
如果没有设置成功,我安装确实没有设置成功,可以手动设置,path增加:D:\Program Files\Geth(安装的根路径)
在命令行中执行 geth version 查看到版本即安装成功,如下:
2、使用Geth创建以太坊私有链
1、新建创世块文件
新建工作目录文件夹,例如:Gth,在此文件下新建创世块文件:genesis.json,内容如下:
{
"config": {
"chainId":4528989,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { }
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
chainId : 以太坊区块链网络Id,ethereum主链是1,私有链只用不要与主链冲突即可。
alloc : 预留账户,如下
"alloc":{
"0x0000000000000000000000000000000000000001":{"balance":"121312321"},
"0x0000000000000000000000000000000000000002":{"balance":"121312321"},
}
Coinbase: 旷工账户
Difficulty: 挖矿难度,0x400,这个是简单。
extraData:相当于备注
gasLimit:最小消耗gas
nonce : 64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求
parentHash : 上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0
Timestamp : 时间戳
2、新建第一个账户
命令行cd到genesis.json所在目录,我为了方便,放在Geth目录下了
命令行执行初始化客户端:
初始化:
geth --datadir data0 init genesis.json
启动客户端:
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3,admin,personal" --rpcaddr "127.0.0.1" --ipcpath "data0\geth\geth.ipc" --rpcport "8486" --port "30304" --networkid "4528989"--allow-insecure-unlock console
没有error就是成功了
这里可能出现的错误要么就是datadir冲突,要么就是端口冲突,自己改改。
如果networkid没有和创世块一致,可能就没有连到本机私有链,最明显的问题就是转账是会提示余额不足
执行命令创建账户
// 新建账户,括号里是交易密码
> personal.newAccount("123456")
// 列出客户端上的账户
> eth.accounts
["0xc47420632c4ae1bc4d7954a24b804720ad02fcc0"]
// 显示账户余额
eth.getBalance(eth.accounts[0])
0
// 解锁
personal.unlockAccount(eth.accounts[0])
// 转账, 需要创建第2个账户才能交易
eth.sendTransaction({from:eth.accounts[0],to:"0x32bcf0bf330fdfca200d5def003bc5fcac646f90",value:"100"})
开启挖矿
// 开启挖矿
miner.start()
// 停止挖矿
miner.stop()
// 挖到后再查看余额,余额会增加
eth.getBalance(eth.accounts[0])
18000000000000
这样我们就创建好第一个账户了
3、新建第二个账户
我们再创建一个账户
// 初始化客户端
> geth --datadir data1 init genesis.json
//
> geth --identity "TestNode2" --datadir "data1" --rpc --rpcapi "db,eth,net,web3,admin, personal" --rpcaddr "127.0.0.1" --ipcpath "data1\geth\geth.ipc" --rpcport "8487" --port "30305" --networkid "4528989" --allow-insecure-unlock console
// 新建账户,括号里是交易密码,密码可以相同
> personal.newAccount("123456")
// 解锁账号
> personal.unlockAccount(eth.accounts[0])
// 查看enode
admin.nodeInfo.enode
"enode://cb42a93bc5378357d30f3598942e43f7b7ec69716f42d7789f840e144d57f78c203c1a78d18ff9637fcb76b12da1639010dbfe2ce1c8b1f0d53b02d2a9432a6f@221.232.139.254:30305"
然后在第一个客户端上附加这个节点, encode就是之前记录的
> admin.addPeer("enode://cb42a93bc5378357d30f3598942e43f7b7ec69716f42d7789f840e144d57f78c203c1a78d18ff9637fcb76b12da1639010dbfe2ce1c8b1f0d5
3b02d2a9432a6f@221.232.139.254:30305")
true
此时,我们可以使用命令号转账了
//客户端2上输入eth.accounts查看账号id
> eth.accounts
["0x5e0bbf69fbcfbe730c6d1c972b541f97a549f5d0"]
//现在从第一个客户端账户向第2个客户端账户划点钱,to就是账号2的id,,这里的钱单位我不太确定
> eth.sendTransaction({from:eth.accounts[0],to:"0x5e0bbf69fbcfbe730c6d1c972b541f97a549f5d0",value:"100"})
转账后必须开启挖矿才能传输上去,双方都可以开起来挖矿
// 开启挖矿
miner.start()
// 停止挖矿
miner.stop()
// 显示余额
eth.getBalance(eth.accounts[0])
可以明显看到,少了100
这样我们就完成了2个客户端的交互与转账