以太坊私有链的搭建和运行
搭建
私有链的搭建主要就是一个配置文件,其他的没什么。
配置文件
在喜欢的位置新建一个文件夹,并在进入该文件夹运行 terminal。
例如:/home/robinu/workspace/private.chaincode
。
编辑一个文件:
gedit gensis.json
写入该配置信息:
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {
"0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789": {
"balance": "999000000000000000000"
}
},
"nonce": "0x0000000000000001",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x01",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0xffffffff"
}
保存并关闭。
参数说明
参数 说明 config.cainId 区块链网络 id(以太坊公网 id 是 1) config.homesteadBlock homestead 算法块 config.eip155Block eip155 算法块 config.eip158Block eip158 算法块 alloc 预设账户 nonce 挖矿用的随机数 mixhash 与 nonce 配合挖矿,与上一个区块的 hash 有关 difficulty 挖矿难度 coinbase 矿工账号 timestamp 时间戳 extraData 块额外信息,挖出块的矿工可随便写点什么 gasLimit 汽油费最大限制
初始化网络
在 /home/robinu/workspace/private.chaincode
目录新建一个存放初始化文件的文件夹。
姑且叫做 db
mkdir db
执行初始化命令:
geth --datadir ./db init gensis.json
初始化脚本执行后目录结构如下:
.
├── db
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000002.ldb
│ │ │ ├── 000003.log
│ │ │ ├── CURRENT
│ │ │ ├── CURRENT.bak
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000004
│ │ └── lightchaindata
│ │ ├── 000002.ldb
│ │ ├── 000003.log
│ │ ├── CURRENT
│ │ ├── CURRENT.bak
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000004
│ └── keystore
└── gensis.json
- chaindata:存放区块数据。
- keystore:存放账户数据。
运行
启动网络
geth --datadir ./db/ --port 10000 --networkid 100 --nodiscover --rpc --rpcaddr 0.0.0.0 --rpcport 10001 --rpcapi eth,net,web3,personal,admin,shh,txpool,debug,miner --rpccorsdomain "*"
参数说明
参数 说明 datadir 指定当前区块链 private key 和 net data 存放位置 port 指定网络端口 networkid 网络 id(1:公链;3:测试链;其他的随意;) nodiscover 关闭节点发现 rpc 开启 rpc rpcaddr rpc ip(0.0.0.0 允许所有) rpcport rpc port rpcapi 设置允许连接的客户端 rpccorsdomain 允许的访问源 console 如果加上该参数,则执行后立即进入 console
进入终端
保持启动网络的 terminal 不要关闭,重新在当前目录启动一个 terminal,执行以下命令进入终端。
geth --datadir ./db/ attach ipc:./db/geth.ipc
该终端可以执行 JavaScript 命令,语法也是一样的。
退出终端只需要输入: exit
即可。
转账案例
以下确保都在终端中执行。
新建账户
转账至少需要 2 个账户,因此首先创建两个账户:
personal.newAccount('123456')
personal.newAccount('123456')
括号里面的是密码。
这时候查看用户:
eth.accounts
可以看到有 2 个地址了。
查看余额
balance = web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
balance = web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
返回的余额都是 0。
由于新的账户都是没有余额的,因此,我们需要通过挖矿产生一些余额以便于转账交易。
挖矿
设置矿工账户
在终端执行挖矿需要提前设置好矿工地址(账户),之后挖到矿的奖励都会发送到该账户。
通过该命令设置第 0 个账户接受挖矿奖励:
miner.setEtherbase(eth.accounts[0])
返回 true 表示设置成功。
也可以自己确认一下哦:
eth.accounts
获得全部用户(应该有两个)
eth.coinbase
应该输出了上边的第一个地址。
开始挖矿
矿工账户设置好了以后就可以挖矿啦:
miner.start(1)
请保持挖矿这个终端不要关闭哦
查看块高
然后在新打开一个终端,同样进入 geth 的 JavaScript 终端。
多次执行 eth.blockNumber
观察块高。可以看到会不断的增长。这表示一直有矿被挖到。
停止挖矿
在 挖矿终端 执行:
miner.stop()
停止挖矿。
这时候再去查看块高的终端查看块高,可以观察到块高已经不再变化啦。
没有特殊需要的话,可以关闭查看块高的终端啦。
此时只需要保持 启动网络的终端 和 挖矿终端 即可。
查看余额
balance = web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
根据挖出的块的数量,可能会有不同的余额值。
解锁账户
使用矿工账户(因为只有他有钱)发起交易,需要首先 解锁账户,因为能解锁,代表你有权利操作该账户嘛。
personal.unlockAccount(eth.accounts[0], '123456')
返回 true。
发起转账
eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, 'ether') })
返回交易 hash
由于现在没有人在挖矿,因此交易信息永远不会被打包到区块链,处于挂起(pending)的状态。可以通过如下命令查看:
txpool.inspect.pending
> txpool.inspect.pending
{
0x203c5370135851c800049e9D7eA3C598317446a7: {
0: "0x438b39e5B6a23003ea5BF49435A0107d43303F72: 1000000000000000000 wei + 90000 gas × 1000000000 wei"
}
}
返回值表明了交易转账了 1 eth 也就是 十的八次方 wei,并且给出 90000 gas × 1000000000 wei
汽油费。
所以说现在又需要执行挖矿啦
再次挖矿
miner.start(1); admin.sleepBlocks(1); miner.stop();
这个命令会在挖出一个区块后直接停止挖矿。
再次查看挂起的交易,已经空空如也了。
txpool.inspect.pending
查看余额
balance = web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
balance = web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
acounts[1] 现在已经有 1 个币了。
结束语
以太坊 基于 geth
的快速入门还是非常简单的,希望本片能够对大家产生一点点的帮助。
祝进步!
网友评论