前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搭建以太坊私有链

搭建以太坊私有链

作者头像
Al1ex
发布2023-09-07 10:21:14
9481
发布2023-09-07 10:21:14
举报
文章被收录于专栏:网络安全攻防网络安全攻防
文章前言

区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术

搭建流程
前期环境准备

Step 1:创建私有链专门的data目录

Step 2:创建创世区块json文件,一般命名为genesis.json,并将其放到私有链目录下:

代码语言:javascript
复制
{
  "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中加入参数配置,例如:

代码语言:javascript
复制
{
  "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的目录(根据自己的情况来调整):

代码语言:javascript
复制
 geth --datadir /home/blockchain/private_eth/eth1 init genesis.json

之后可以使用tree命令以树结构显示datadir的目录结构(可以发现新增了不少文件,其中/geth/chaindata用于存放区块数据,/keysotre用于存放账户数据)

启动私有链节点

启动命令如下(注意:以下命令中的端口号、ip地址、以及networkid要自己更换成自己的才可以使用,根据环境而定):

代码语言:javascript
复制
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、创建账户(参数为账户密码)

代码语言:javascript
复制
personal.newAccount("12345678")

2、查询账户列表

代码语言:javascript
复制
eth.accounts

备注:当查询账户时会返回一个数组,在这种情况下如果你想知道指定账户的地址你可以直接使用下标来获取,例如:eth.accounts[0]等

3、查询账户余额

我们可以通过以下三种方式获取账户余额,由于是新建的账户所以余额为0,也不足为奇,后面会通过挖矿来获取

代码语言:javascript
复制
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance("0x5ccd2b51b984943931b8b1f40906116f610161d1")
0
> balance=web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
0

4、查看矿工的账户地址

代码语言:javascript
复制
eth.coninbase

5、设置矿工的账户地址,即奖励地址

代码语言:javascript
复制
> eth.coninbase
undefined
> miner.setEtherbase(eth.accounts[0])
true
> eth.coinbase
"0x5ccd2b51b984943931b8b1f40906116f610161d1"
> 

6、挖矿操作

代码语言:javascript
复制
miner.start(100)

这里的start的参数表示挖矿使用的线程数,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后就会开始挖矿,此时屏幕会被挖矿信息刷屏,等DAG完成后会出现大量的挖矿操作,如下图所示(这个图标还是挺好看的哦)

7、停止挖矿

代码语言:javascript
复制
miner.stop()

8、查看矿工的账户所持资产数量的变化

代码语言:javascript
复制
eth.getBalance(eth.accounts[0])

注意:1 ether = 1e18 wei,使用eth.getBalance()获取到的账户余额默认返回的单位是wei,你也可以使用ether作为单位,返回账户余额,与上面的常结果相对应

代码语言:javascript
复制
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")

8、账户转账

a、解锁账户

如果我们打算从eth.accounts[0]向eth.accounts[1]转账,那么转账之前需要先解锁eth.accounts[0]:

代码语言:javascript
复制
personal.unlockAccount(eth.accounts[0],"12345678",0)

发现会报以上错误,这是因为新版本geth出于安全考虑,默认禁止了HTTP通道解锁账户,此时我们需要在启动命令中添加参数"--allow-insecure-unlock"

代码语言:javascript
复制
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

之后我们再次进行解锁操作:

代码语言:javascript
复制
#格式说明:
personal.unlockAccount(eth.accounts[0],"密码","时间(0表示长时间解锁)")

#执行示例:
personal.unlockAccount(eth.accounts[0],"12345678",0)

B、开始转账

代码语言:javascript
复制
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,'ether')})

在这个时候我们的交易会在交易池中等待打包,直到被打包完成后才会完成该交易,我们查看交易池会发现有一个交易在padding中:

代码语言:javascript
复制
#查看交易池中等待被打包的交易:
txpool.status

查看已提交但还未被处理的交易,pending表示已提交但还未被处理的交易:

代码语言:javascript
复制
txpool.inspect.pending

查看当前待确认交易:

代码语言:javascript
复制
eth.getBlock("pending",true).transactions

为了完成交易我们需要再次挖矿,之后再次看交易信息:

代码语言:javascript
复制
miner.start(100)
miner.stop()
txpool.status

之后我们查看已提交但还未被处理的交易,目前没有已提交但还未被处理的交易

代码语言:javascript
复制
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值查询发起交易时的详情

代码语言:javascript
复制
eth.getTransaction("0xe5a58428588fcad55c95eee36307b545a67b6bcb11c85cad967202f398b06748")

根据刚刚执行eth.sendTransaction()返回的交易hash值,返回一个交易的收据

代码语言:javascript
复制
eth.getTransactionReceipt("0xe5a58428588fcad55c95eee36307b545a67b6bcb11c85cad967202f398b06748")

注意:处于pending状态的交易,收据是不可用的

10、查询区块

a、查询最新区块

代码语言:javascript
复制
eth.getBlock('latest')

b、根据区块Number或Hash查询区块

代码语言:javascript
复制
eth.getBlock(0)
代码语言:javascript
复制
eth.getBlock("0xd33a8a18e09a0b89c588d813c5734c6c72c632119e4a5af1be0e64f685a340ff")
文末小结

搭建以太坊私有链需要进行一系列的步骤,包括安装必要的软件、配置节点、创建创世块、启动私有链等,在这个过程中我们需要注意一些细节,例如:选择合适的网络ID、管理账户、配置节点参数等,通过搭建私有链我们可以在本地环境中进行以太坊应用的开发和测试,从而更好地理解以太坊的工作原理和应用场景

参考链接

https://github.com/ethereum/go-ethereum

https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-personal

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章前言
  • 搭建流程
    • 前期环境准备
      • 创世区块初始化
        • 启动私有链节点
          • 本地接口简易测试
          • 文末小结
          • 参考链接
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档