文章前言
区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术
搭建流程
前期环境准备
Step 1:创建私有链专门的data目录
Step 2:创建创世区块json文件,一般命名为genesis.json,并将其放到私有链目录下:
{
"config": {
"chainId": 111,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
参数说明:
-
nonce:随机数,用于挖矿过程中的计算
-
timestamp:区块生成的时间戳
-
parentHash:上一个区块的哈希值
-
extraData:额外的数据,用于在创世区块中添加一些特殊信息
-
gasLimit:每个区块中限制的最大gas数量
-
difficulty:挖矿难度系数,用于控制区块生成的速度
-
mixHash:用于挖矿的哈希值
-
coinbase:挖矿的奖励地址,该地址将会收到挖矿所得的奖励
-
alloc:指定一些地址,将会在创世区块中预先分配一些代币
-
config:一些网络配置参数,例如区块链的网络ID、链的名称等
-
ChainId:区块链的唯一标识符,用于识别不同的区块链网络,必须为整数类型
-
HomesteadBlock:Homestead协议的生效区块高度,Homestead是以太坊网络的第一个正式协议版本
-
EIP150Block:EIP-150协议的生效区块高度,该协议包含了一些安全性和效率方面的改进
-
EIP155Block:EIP-155协议的生效区块高度,该协议是为了解决交易重放攻击而引入的
-
EIP158Block:EIP-158协议的生效区块高度,该协议包含了一些存储费用和状态费用方面的改进
-
byzantiumBlock:以太坊网络实施Byzantium协议的块高度
-
constantinopleBlock:以太坊网络实施Constantinople协议的块高度
-
petersburgBlock:以太坊网络实施Petersburg协议的块高度
-
istanbulBlock:以太坊网络实施Istanbul协议的块高度
-
berlinBlock:以太坊网络实施Berlin协议的块高度
-
londonBlock:以太坊网络实施London协议的块高度
ChainID参数常见值说明:
-
Ethereum主网(Mainnet):1
-
Ropsten测试网络:3
-
Rinkeby测试网络:4
-
Kovan测试网络:42
-
Binance Smart Chain主网:56
-
Binance Smart Chain测试网络:97
-
Huobi Eco Chain主网:128
-
Huobi Eco Chain测试网络:256
如果你自己想要在创世区块中预设一些账户,可以在alloc中加入参数配置,例如:
{
"config": {
"chainId": 111,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
创世区块初始化
使用以下命令初始化创世区块,注意需要指定私有链数据的存放目录、创世区块文件genesis.json的目录(根据自己的情况来调整):
geth --datadir /home/blockchain/private_eth/eth1 init genesis.json
之后可以使用tree命令以树结构显示datadir的目录结构(可以发现新增了不少文件,其中/geth/chaindata用于存放区块数据,/keysotre用于存放账户数据)
启动私有链节点
启动命令如下(注意:以下命令中的端口号、ip地址、以及networkid要自己更换成自己的才可以使用,根据环境而定):
sudo geth --networkid 111 --datadir /home/blockchain/private_eth/eth1 --identity "node1" --http --http.port "8545" --http.addr "192.168.204.139" --nodiscover --http.api "eth,net,web3,admin,txpool,debug,miner" --rpc.enabledeprecatedpersonal --allow-insecure-unlock console
本地接口简易测试
1、创建账户(参数为账户密码)
personal.newAccount("12345678")
2、查询账户列表
eth.accounts
备注:当查询账户时会返回一个数组,在这种情况下如果你想知道指定账户的地址你可以直接使用下标来获取,例如:eth.accounts[0]等
3、查询账户余额
我们可以通过以下三种方式获取账户余额,由于是新建的账户所以余额为0,也不足为奇,后面会通过挖矿来获取
eth.getBalance(eth.accounts[0])
0
"0x5ccd2b51b984943931b8b1f40906116f610161d1") eth.getBalance(
0
"ether") balance=web3.fromWei(eth.getBalance(eth.accounts[0]),
0
4、查看矿工的账户地址
eth.coninbase
5、设置矿工的账户地址,即奖励地址
> eth.coninbase
undefined
> miner.setEtherbase(eth.accounts[0])
true
> eth.coinbase
"0x5ccd2b51b984943931b8b1f40906116f610161d1"
>
6、挖矿操作
miner.start(100)
这里的start的参数表示挖矿使用的线程数,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后就会开始挖矿,此时屏幕会被挖矿信息刷屏,等DAG完成后会出现大量的挖矿操作,如下图所示(这个图标还是挺好看的哦)
7、停止挖矿
miner.stop()
8、查看矿工的账户所持资产数量的变化
eth.getBalance(eth.accounts[0])
注意:1 ether = 1e18 wei,使用eth.getBalance()获取到的账户余额默认返回的单位是wei,你也可以使用ether作为单位,返回账户余额,与上面的常结果相对应
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
8、账户转账
a、解锁账户
如果我们打算从eth.accounts[0]向eth.accounts[1]转账,那么转账之前需要先解锁eth.accounts[0]:
personal.unlockAccount(eth.accounts[0],"12345678",0)
发现会报以上错误,这是因为新版本geth出于安全考虑,默认禁止了HTTP通道解锁账户,此时我们需要在启动命令中添加参数"--allow-insecure-unlock"
sudo geth --networkid 111 --datadir /home/blockchain/private_eth/eth1 --identity "node1" --http --http.port "8545" --http.addr "192.168.204.139" --nodiscover --http.api "eth,net,web3,admin,txpool,debug,miner" --rpc.enabledeprecatedpersonal --allow-insecure-unlock console
之后我们再次进行解锁操作:
#格式说明:
personal.unlockAccount(eth.accounts[0],"密码","时间(0表示长时间解锁)")
#执行示例:
personal.unlockAccount(eth.accounts[0],"12345678",0)
B、开始转账
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,'ether')})
在这个时候我们的交易会在交易池中等待打包,直到被打包完成后才会完成该交易,我们查看交易池会发现有一个交易在padding中:
#查看交易池中等待被打包的交易:
txpool.status
查看已提交但还未被处理的交易,pending表示已提交但还未被处理的交易:
txpool.inspect.pending
查看当前待确认交易:
eth.getBlock("pending",true).transactions
为了完成交易我们需要再次挖矿,之后再次看交易信息:
miner.start(100)
miner.stop()
txpool.status
之后我们查看已提交但还未被处理的交易,目前没有已提交但还未被处理的交易
txpool.inspect.pending //查看已提交但是未被处理的交易,发现为空
eth.getBlock("pending",true).transactions //查看当前待确认的交易,发现为空
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") //查询账户0的余额
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether") //查询账户0的余额
9、查看交易和区块总数
查看当前区块总数
根据刚才发起的交易hash值查询发起交易时的详情
eth.getTransaction("0xe5a58428588fcad55c95eee36307b545a67b6bcb11c85cad967202f398b06748")
根据刚刚执行eth.sendTransaction()返回的交易hash值,返回一个交易的收据
eth.getTransactionReceipt("0xe5a58428588fcad55c95eee36307b545a67b6bcb11c85cad967202f398b06748")
注意:处于pending状态的交易,收据是不可用的
10、查询区块
a、查询最新区块
eth.getBlock('latest')
b、根据区块Number或Hash查询区块
eth.getBlock(0)
eth.getBlock("0xd33a8a18e09a0b89c588d813c5734c6c72c632119e4a5af1be0e64f685a340ff")
文末小结
搭建以太坊私有链需要进行一系列的步骤,包括安装必要的软件、配置节点、创建创世块、启动私有链等,在这个过程中我们需要注意一些细节,例如:选择合适的网络ID、管理账户、配置节点参数等,通过搭建私有链我们可以在本地环境中进行以太坊应用的开发和测试,从而更好地理解以太坊的工作原理和应用场景
参考链接
https://github.com/ethereum/go-ethereum
https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-personal
原文始发于微信公众号(七芒星实验室):搭建以太坊私有链
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论