如何创建一个GETH节点(单节点,windows环境)
所有命令都是在powershell上执行的
1、创建“创世块”
初始化配置
创建一个 hdgenesis.json文件,拷贝到geth根目录
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x40000",
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00",
"alloc": {}
}
参数说明如下图:
创建数据存放地址并初始化创世块
(同一个网络中,创世块必须是一样的,否则无法联通)
走到数据目录
cd E:\blockchain\private_chain_env\1_node
cat .\hdgenesis.json
初始化创世纪节点
geth --datadir ".\" init hdgenesis.json --datadir 参数是指定数据存放文件夹
2、启动一个网络节点
查看端口占用情况
netstat -ano | findstr "30303"
(查找所有占用30303端口的进程)
get-process -Id 11276
(如何能查到进程,说明已经开启了Mist.exe,将其关闭,否则geth命令无法执行)
执行命令
geth --identity "HDetherum" --rpc --rpccorsdomain "*" --datadir ".\" --port "30303" --rpcapi "db,eth,net,web3,personal" --networkid 95520 console
启动节点, 加上console 表示启动后,启用命令行;第二次也执行该命令
注意 networkid 95520,以太坊节点之间能够互相链接需要满足
1)相同的协议版本
2)相同的networkid
所以搭建私有网络最方便的方法就是通过geth命令中的--networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法.
参数说明:
参数解析:
--identity 自定义节点名称
--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--datadir 区块链数据存储目录
--networkid 网络标识,私有链取一个大于4的随意的值
--rpc 启用ipc服务,默认端口号8545
--rpcapi 表示可以通过ipc调用的对象,一般为 db,eth,net,web3
--rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
console 打开一个可交互的javascript环境
更多参数说明:(https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options )
执行结果:
在shell内,可以执行exit退出shell
验证:
1)telnet localhost 8545
ctrl+] 退出shell
quit退出telnet
2)netstat -ano | findstr "30303"
(查找所有占用30303端口的进程)
3)另外打开一个powershell的geth客户端访问
geth attach http://127.0.0.1:8545
(这种方式访问时,必须增加 personal选项 (资料来源于:https://ethereum.stackexchange.com/questions/3996/error-personal-unlockaccount-method-not-implemented))
4)通过mist客户端访问
5)示意图
3、账号管理
创建主账户 personal.newAccount(‘密码')
personal.newAccount("123456")
(geth console启动后,运行如上命令创建一个主账户(没有账户不允许挖矿),根据提示设置交易密码,创建成功后就可以使用console进行相关的单节点命令操作)
测试环境设置两个账号:挖矿账号和普通账号
account[0] -- 挖矿账户
account[1] -- 普通账户
查看账号
查询账户余额
思路:把账户赋值给某一个变量,同时查询账户中的余额
//查看挖矿账户余额
baseAccount = eth.accounts[0]
num = eth.getBalance(baseAccount)
//查看普通账户的余额
account1 = eth.accounts[1]
num1=eth.getBalance(account1)
4、挖矿
示意图
开始挖矿
miner.start()
停止挖矿
miner.stop()
查看结果
num = eth.getBalance(eth.accounts[0])
web3.fromWei(num)
5、转账
执行
查看挖矿账户余额
baseAccount = eth.accounts[0]
num = eth.getBalance(baseAccount)
查看普通账户的余额
account1 = eth.accounts[1]
num1=eth.getBalance(account1)
转账
//从baseAccount账户转给account1账户1eth
personal.unlockAccount(baseAccount,"123456")
eth.sendTransaction({from : baseAccount, to : account1 , value : web3.toWei(1,"ether")})
// 查看账户余额
num = eth.getBalance(baseAccount)
num1=eth.getBalance(account1)
查看挂起的交易
eth.pendingTransactions
提交转账之后,观察挖矿shell的输出,会出现一条打包转账交易的记录,等待新的区块继续生成的时候,account1 账户的余额才会更新。
示意图
可能的错误解析
操作间隔过长
挖矿的shell需要 --rpcapi "db,eth,net,web3,personal" personal,另一个shell才能管理个人账户信息
6、其他geth命令
待续....