Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构建基于PoA共识的以太坊私链

构建基于PoA共识的以太坊私链

原创
作者头像
孟斯特
发布于 2024-09-27 03:05:24
发布于 2024-09-27 03:05:24
3140
举报
文章被收录于专栏:EthereumEthereumcode人生

1. 为什么要构建私链?

构建私链有多个理由,主要包括:

  1. 数据隐私与安全性
    • 控制数据访问:私链允许组织对谁可以访问和参与区块链网络进行控制,从而保护敏感数据。
    • 防止恶意行为:与公链相比,私链更容易限制恶意攻击,因为只有经过授权的参与者才能加入。
  2. 高性能与可扩展性
    • 快速交易处理:由于参与者数量较少,私链通常可以处理更高的交易速度,减少交易确认时间。
    • 定制化配置:可以根据特定需求优化网络参数(如区块生成时间、共识算法等)。
  3. 定制化特性
    • 灵活性:可以根据组织的需求定制共识机制、合约功能和网络架构,适应特定的业务场景。
    • 专有协议:可实现专门的协议或应用,与公链的标准化和限制不同。
  4. 合规性与监管
    • 满足合规要求:私链能够帮助企业遵循行业法规和标准,比如金融行业的合规要求。
    • 审计和监管:能够更容易地实施审计和监控机制,确保遵循法律和规定。
  5. 低成本与资源优化
    • 资源节省:在私链中,通常只需要维护少量的节点,减少了硬件和网络带宽的需求。
    • 控制网络费用:由于没有激励机制(如矿工奖励),运营成本通常较低。
  6. 业务合作与联盟链
    • 跨组织协作:私链可用于多个组织之间的合作,尤其是在供应链管理和金融交易中。
    • 联盟链:可以构建联盟链,让特定合作伙伴共同参与,确保数据的透明性和可追溯性。
  7. 测试与开发:开发人员可以在私链上进行测试,验证智能合约和应用程序的功能,而不必担心对公共网络的影响。

2. 构建基于PoA的ethereum私链

2.1 创建账户

创建两个账户,分别为account 1account 2,用做初始的验证者地址。

代码语言:bash
AI代码解释
复制
# node
# account 1
$ geth --datadir ./node account new
INFO [09-27|09:40:38.644] Maximum peer count                       ETH=50 total=50
INFO [09-27|09:40:38.645] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:

Your new key was generated

Public address of the key:   0x51C4d2FeEBBAd01c2202d7CE772de1D953571201
Path of the secret key file: node/keystore/UTC--2024-09-27T01-40-44.544853516Z--51c4d2feebbad01c2202d7ce772de1d953571201

- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

# account 2
$ geth --datadir ./node account new
INFO [09-27|09:41:29.078] Maximum peer count                       ETH=50 total=50
INFO [09-27|09:41:29.079] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:

Your new key was generated

Public address of the key:   0x19Eac074dba9BBa2Eb97FFE7BBA80A9E9E83EcBe
Path of the secret key file: node/keystore/UTC--2024-09-27T01-41-34.412585202Z--19eac074dba9bba2eb97ffe7bba80a9e9e83ecbe

- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

2.2 创建创世区块

配置创世区块的配置文件genesis.json,内容如下:

代码语言:json
AI代码解释
复制
{
    "config": {
        "chainId": 377777,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "clique": {
            "period": 5,
            "epoch": 30000
        }
    },
    "difficulty": "1",
    "gasLimit": "8000000",
    "extradata": "0x000000000000000000000000000000000000000000000000000000000000000051C4d2FeEBBAd01c2202d7CE772de1D95357120119Eac074dba9BBa2Eb97FFE7BBA80A9E9E83EcBe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "alloc": {
        "51C4d2FeEBBAd01c2202d7CE772de1D953571201": {
            "balance": "100000000000000000000"
        },
        "19Eac074dba9BBa2Eb97FFE7BBA80A9E9E83EcBe": {
            "balance": "100000000000000000000"
        }
    }
}

初始验证者地址必须通过extradata字段指定。

代码语言:bash
AI代码解释
复制
$ geth --datadir ./node init ./genesis.json

2.3 启动节点

创世区块创建后,就可以启动私链节点了。

代码语言:bash
AI代码解释
复制
# networkid 是genesis.json中指定的chainId
$ geth --datadir ./node --networkid 377777 

2.4 进入 Geth 控制台测试

代码语言:bash
AI代码解释
复制
$ geth attach ./node/geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.13.15-stable-c5ba367e/linux-amd64/go1.22.7
at block: 1 (Fri Sep 27 2024 10:01:07 GMT+0800 (CST))
 datadir: /root/vscode/ethereum/node
 modules: admin:1.0 clique:1.0 debug:1.0 engine:1.0 eth:1.0 miner:1.0 net:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d or type exit
# 获取最新区块高度
> eth.blockNumber
1
# 获取最新区块信息
> eth.getBlock('latest')
{
  difficulty: 2,
  extraData: "0xd883010d0f846765746888676f312e32312e39856c696e757800000000000000ebcda637df33928e4ce34051f777ccac21c643a8dcd1984b019984af41d99d5c41ff73559c837b0204c7764c71d8b5b49ecf63a555ee127e3d0cc86673d3214100",
  gasLimit: 8007811,
  gasUsed: 0,
  hash: "0xe4c14eb995dbcc9652a53fa8d47402dead30fa82af57b11399f9db23b06ab78b",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 1,
  parentHash: "0xb2ad7555b68d5c1e334d44033ef78c869fa4248a64a976a172318126a3db55a7",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 606,
  stateRoot: "0xc5f02ccb91cfbde9f92912bb02aac9b2601e9a6e41ea9335343fa1991d277a5a",
  timestamp: 1727402467,
  totalDifficulty: 3,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
# 获取账户余额
> eth.getBalance("0x51C4d2FeEBBAd01c2202d7CE772de1D953571201")
100000000000000000000
> eth.getBalance("0x19Eac074dba9BBa2Eb97FFE7BBA80A9E9E83EcBe")
100000000000000000000
# 获取账户列表
> eth.accounts
["0x51c4d2feebbad01c2202d7ce772de1d953571201", "0x19eac074dba9bba2eb97ffe7bba80a9e9e83ecbe"]

curl 命令测试:

代码语言:bash
AI代码解释
复制
# 获取最新区块高度,result 为十六进制字符串
$ curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x1"}
# 获取账户余额
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x19Eac074dba9BBa2Eb97FFE7BBA80A9E9E83EcBe","latest"],"id":1}' http://localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x56bc75e2d63100000"}

3. 扩展:extradata 字段介绍

extradata 字段是以太坊区块头的一部分,主要用于 Proof of Authority (PoA) 共识机制(如 Clique)。它包含特定的信息,以便于节点之间的共识和验证。以下是对 extradata 字段的详细介绍:

3.1 功能

  • 签名者信息extradata 通常包含当前区块的签名者(或验证者)地址。这些地址是网络中被授权生成区块的节点。
  • 额外元数据:在某些情况下,可以包括其他自定义信息,如版本号或链的特定参数。

3.2 格式

extradata 是一个字节数组,其结构通常如下:

  • 32个零字节:用于预留空间。
  • 签名者地址:包含网络中所有签名者的地址,每个地址占 20 字节(40 个十六进制字符)。
  • 65个零字节:用于填充,确保 extradata 的总字节长度符合要求。

3.3 示例

假设你有三个签名者地址,extradata 的构建步骤如下:

  1. 32个零字节(在十六进制表示为):0000000000000000000000000000000000000000000000000000000000000000
  2. 签名者地址:0xD22688d01E3345Cc2911C95447a3a1bcE32CB741 0x9A265B5Ef402813ae057e53f12D2B19d9aA5CEb4 0x843D259ab8C380FA576Cb013503CF961B63d12BB
  3. 65个零字节:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  4. 拼接结果:0x0000000000000000000000000000000000000000000000000000000000000000D22688d01E3345Cc2911C95447a3a1bcE32CB7419A265B5Ef402813ae057e53f12D2B19d9aA5CEb4843D259ab8C380FA576Cb013503CF961B63d12BB00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

3.4 使用场景

  • 共识机制:在 PoA 网络中,extradata 用于确定哪个节点在某一时刻被授权生成新区块。
  • 数据完整性:由于 extradata 是区块头的一部分,确保了与块的其他信息一起传递,增强了数据的完整性和一致性。

3.5 注意事项

  • 字节长度:确保 extradata 的字节长度符合预期,错误的格式可能导致链启动失败。
  • 动态更新:在网络运行过程中,可以使用相应的 API 更新签名者信息,确保网络的正常运作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
多验证者节点PoA私链搭建
孟斯特
2024/10/11
2620
多验证者节点PoA私链搭建
PoA Clique共识下新增同步节点
增加同步节点(Full Nodes)对于区块链网络,尤其是基于 PoA(Proof of Authority)Clique 共识机制的私链,具有重要意义。以下是增加同步节点的主要原因及其优势:
孟斯特
2024/11/20
1690
PoA Clique共识下新增同步节点
以太坊私链入门
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/02/02
5.1K2
以太坊搭建私有链
在以太坊上部署智能合约、发起交易需要花费以太币。而私链和公有链没有关系,不用同步大量的数据,也不用花钱购买以太币,可以很好的满足智能合约的开发和测试要求,而且在私有链上开发的智能合约可以很容易的部署到以太坊的公有链上。
foochane
2019/05/23
1.8K0
部署一个私链以太坊的智能合约
部署智能合约的步骤为: 启动一个以太坊节点 (例如geth或者testrpc)。 使用solc编译智能合约。 => 获得二进制代码。 将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点
rectinajh
2018/05/17
2.4K0
【手把手】如何在10分钟内搭建一个以太坊私有链?
在开发以太坊时,很多时候需要搭建一条以太坊私有链,这篇来自作者熊丽兵的文章,手把手教你10分钟内如何在Mac上进行搭建。 作者 | 熊丽兵 整理 | 科科 阅读本文前,你应该对以太坊语言有所了解,如果你还不了解,建议你先看以太坊是什么。 go-ethereum客户端安装 Go-ethereum客户端通常被称为Geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。Geth得益于Go语言的多平台特性,支持在多个平台上使用(比如Windows、Linux、Mac)。Geth是以太坊协议的具体落地实现,通过
区块链大本营
2018/06/19
2.5K0
以太坊数据存证性能与膨胀率测试
我们基于区块链在企业中的应用最广泛的就是“存证”功能需求,这是利用了区块链不可篡改和数据共享的特点,存证的业务数据一方面可以保证留痕和追溯,另一方面也实现了多个节点(如果部署在不同企业和部门)之间的数据共享。如果要实现存证,我们最关心并不是图灵完备,也不是去中心化,而是 存证的性能(也就是TPS)和数据膨胀率(也就是存1M的业务数据,单个节点要消耗多少M的磁盘空间)。
深蓝studyzy
2023/09/15
3370
以太坊数据存证性能与膨胀率测试
以太坊数据存证性能与膨胀率测试
我们基于区块链在企业中的应用最广泛的就是“存证”功能需求,这是利用了区块链不可篡改和数据共享的特点,存证的业务数据一方面可以保证留痕和追溯,另一方面也实现了多个节点(如果部署在不同企业和部门)之间的数据共享。如果要实现存证,我们最关心并不是图灵完备,也不是去中心化,而是 存证的性能(也就是TPS)和数据膨胀率(也就是存1M的业务数据,单个节点要消耗多少M的磁盘空间)。
深蓝studyzy
2023/09/14
3020
用Geth设置基于POA权利证明的私有以太网网络
目标:逐步指导,帮助你使用权威证明共识引擎(也称为clique)设置本地私有以太网网络。
笔阁
2019/03/20
2.7K0
用Geth设置基于POA权利证明的私有以太网网络
以太坊 Truffle 测试代币锁仓,转账,空投
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/05/17
3.3K0
以太坊 Truffle 测试代币锁仓,转账,空投
基于docker的以太坊集群的私有链开发环境
转载博文:https://www.jianshu.com/p/8af386ec5f9e
墨文
2020/02/28
2.8K0
搭建以太坊私有链
区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术
Al1ex
2023/09/07
1.8K1
搭建以太坊私有链
以太坊智能合约部署与交互
我们再打开一个终端,打开cluster1的peer02的控制台,直接at到上一个终端部署的智能合约地址并进行set操作
笔阁
2018/09/04
2.8K0
以太坊智能合约部署与交互
以太坊介绍和使用
以太坊是一个能够在区块链上实现智能合约、开源的底层系统。换言之,以太坊是可编程的区块链,它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,以太坊是就可以作为多种类型去中心化区块链应用的平台,这些应用比如包括之前很火的各种代币但并不仅限于此,我们可以做很多除了代币之外的东西,比如你可以输出一行代表自己不是外行身份的hello world,或者在上面做一个简单的计算器,总之你可以在上面实现你想要的任何功能。
fnatic
2022/07/15
37.5K0
以太坊钱包 ERC20 Token 代币 Node 封装接口
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/06/01
2.2K0
以太坊钱包 ERC20 Token 代币 Node 封装接口
【附代码】如何在私有链上编写、部署与以太坊进行交互的智能合约
原文:How To Write, Deploy, and Interact with Ethereum Smart Contracts on a Private Blockchain 作者:jack_schultz 翻译:无阻我飞扬 摘要:本文作者以极长的篇幅给出了在私有区块链上编写、部署以及与以太坊进行交互的智能合约的较为完整的代码、相关细节步骤、用户界面等。作者是希望借助他这篇文章,大家可以自行在私有以太坊区块链上编写并部署一个智能合约,建议用PC端打开,以下是译文。 这里的规则是:如果通读本文,则
区块链大本营
2018/05/10
1.9K0
从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络
使用此博文进行安装配置:https://blog.csdn.net/w88193363/article/details/79402074
墨文
2020/02/28
1.8K0
从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络
在以太坊私有链上部署智能合约
上节简单介绍了基于以太坊搭建私有链以及挖矿和交易,在部署智能合约之前请确保私有链上的账户有余额,因为部署智能合约需要消耗 Gas ,而 Gas 需要 ether 币来兑换。
字节流动
2020/06/02
1.4K0
在以太坊私有链上部署智能合约
PoA 共识下的ethereum如何引入出块奖励?
在之前的文章中介绍了通过修改源码的方式来实现PoA共识下的出块奖励,在只有一个节点的情况下,这种方式并不会有什么问题;一旦有新的节点加入网络,那新增的节点就会卡在数据同步的阶段。那为什么会出现这种情况呢?
孟斯特
2024/12/10
1470
PoA 共识下的ethereum如何引入出块奖励?
以太坊如何搭建私有连联盟链
如何启动geth节点对大家来说已经不是什么难事,今天博主就带大家学习一下如何搭建两个节点的联盟链。
程序新视界
2022/05/06
1.4K0
相关推荐
多验证者节点PoA私链搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档