BNB智能链的目标是为BNB信标链带来可编程性和互操作性。为了拥抱现有的流行社区和先进技术,与以太坊上所有现有的智能合约和以太坊工具保持兼容将带来巨大的好处。而要实现这一目标,最简单的解决方案是基于 go-ethereum 分叉进行开发,因为我们非常尊重以太坊的伟大工作。
BNB智能链基于go-ethereum分叉开始开发。因此,您可能会看到许多工具、二进制文件和文档都是基于以太坊的,例如名称“geth”。
但从 EVM 兼容的基准出发,BNB 智能链引入了一个由 21 个验证者组成的系统,具有权益证明(PoSA)共识,可以支持较短的出块时间和较低的费用。质押最具约束力的候选验证者将成为验证者并生成区块。双符号检测和其他削减逻辑保证了安全性、稳定性和链终结性。
BNB 智能链将是:
更多详细信息请参见白皮书。
尽管工作量证明(PoW)已被认可为实现去中心化网络的实用机制,但它对环境并不友好,并且还需要大量参与者来维护安全性。
权威证明 (PoA) 提供了对 51% 攻击的一定防御,提高了效率和对某些级别的拜占庭玩家(恶意或黑客攻击)的容忍度。与此同时,PoA 协议最受诟病的地方在于它不像 PoW 那样去中心化,因为验证者(即轮流出块的节点)拥有所有权限,并且容易受到腐败和安全攻击。
其他区块链,例如 EOS 和 Cosmos,都引入了不同类型的副股权证明 (DPoS),以允许代币持有者投票并选择验证人集。它增加了权力下放并有利于社区治理。
为了结合 DPoS 和 PoA 达成共识,BNB 智能链实现了一种名为 Parlia 的新型共识引擎,它:
BNB 将在 BNB 智能链上运行,就像 ETH 在以太坊上运行一样,因此它仍然是 BSC 的native token
。这意味着,BNB 将用于:
gas
以在BSC上部署或调用智能合约以下许多内容与 go-ethereum 相同或相似。
有关先决条件和详细构建说明,请阅读安装说明。
构建geth
需要 Go(版本 1.21 或更高版本)和 C 编译器(GCC 5 或更高版本)。您可以使用您最喜欢的包管理器来安装它们。安装依赖项后,运行
make geth
或者,构建全套实用程序:
make all
如果使用自建二进制文件运行节点时出现此类错误:
Caught SIGILL in blst_cgo_init, consult < blst > /bindinds/go/README.md.
请尝试添加以下环境变量并重新构建:
export CGO_CFLAGS= " -O -D__BLST_PORTABLE__ "
export CGO_CFLAGS_ALLOW= " -O -D__BLST_PORTABLE__ "
bsc 项目附带了在cmd
目录中找到的几个包装器/可执行文件。
命令 | 描述 |
---|---|
geth | 主要 BNB 智能链客户端二进制文件。它是 BSC 网络(主网、测试网或专用网)的入口点,能够作为完整节点(默认)、存档节点(保留所有历史状态)或轻节点(实时检索数据)运行。它具有与 go-ethereum 相同且更多的 RPC 和其他接口,并且可以被其他进程用作通过 HTTP、WebSocket 和/或 IPC 传输之上公开的 JSON RPC 端点进入 BSC 网络的网关。 geth --help 和命令行选项的 CLI 页面。 |
clef | 独立签名工具,可用作geth 的后端签名器。 |
devp2p | 与网络层上的节点交互的实用程序,无需运行完整的区块链。 |
abigen | 源代码生成器,用于将以太坊合约定义转换为易于使用、编译时类型安全的 Go 包。它在普通的以太坊合约 ABI 上运行,如果合约字节码也可用,则具有扩展功能。然而,它也接受 Solidity 源文件,使开发更加简化。请参阅我们的原生 DApp 页面了解详细信息。 |
bootnode | 我们的以太坊客户端实现的精简版本,仅参与网络节点发现协议,但不运行任何更高级别的应用程序协议。它可以用作轻量级引导节点,以帮助在专用网络中查找对等点。 |
evm | EVM(以太坊虚拟机)的开发实用程序版本,能够在可配置的环境和执行模式中运行字节码片段。其目的是允许对 EVM 操作码进行隔离、细粒度的调试(例如evm --code 60ff60ff --debug run )。 |
rlpdump | 开发人员实用工具,用于将二进制 RLP(递归长度前缀)转储(以太坊协议网络和共识所使用的数据编码)转换为用户友好的分层表示形式(例如rlpdump --hex CE0183FFFFFFC4C304050583616263 )。 |
geth
详细了解所有可能的命令行标志超出了此处的范围(请查阅我们的 CLI Wiki 页面),但我们列举了一些常见的参数组合,可帮助您快速了解如何运行自己的geth
实例。
硬件必须满足某些要求才能在主网上运行完整节点:
测试网的要求:
# Linux
wget $( curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest | grep browser_ | grep geth_linux | cut -d " -f4 )
mv geth_linux geth
chmod -v u+x geth
# MacOS
wget $( curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest | grep browser_ | grep geth_mac | cut -d " -f4 )
mv geth_macos geth
chmod -v u+x geth
//== mainnet
wget $( curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest | grep browser_ | grep mainnet | cut -d " -f4 )
unzip mainnet.zip
//== testnet
wget $( curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest | grep browser_ | grep testnet | cut -d " -f4 )
unzip testnet.zip
从这里下载最新的链数据快照。按照指南构建文件。
./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0
# # It is recommend to run fullnode with `--tries-verify-mode none` if you want high performance and care little about state consistency
# # It will run with Hash-Base Storage Scheme by default
./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode none
# # It runs fullnode with Path-Base Storage Scheme.
# # It will enable inline state prune, keeping the latest 90000 blocks' history state by default.
./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode none --state.scheme path
默认从./node/bsc.log监控日志。当节点开始同步时,应该能够看到以下输出:
t=2022-09-08T13:00:27+0000 lvl=info msg= " Imported new chain segment " blocks=1 txs=177 mgas=17.317 elapsed=31.131ms mgasps=556.259 number=21,153,429 hash=0x42e6b54ba7106387f0650defc62c9ace3160b427702dab7bd1c5abb83a32d8db dirty= " 0.00 B "
t=2022-09-08T13:00:29+0000 lvl=info msg= " Imported new chain segment " blocks=1 txs=251 mgas=39.638 elapsed=68.827ms mgasps=575.900 number=21,153,430 hash=0xa3397b273b31b013e43487689782f20c03f47525b4cd4107c1715af45a88796e dirty= " 0.00 B "
t=2022-09-08T13:00:33+0000 lvl=info msg= " Imported new chain segment " blocks=1 txs=197 mgas=19.364 elapsed=34.663ms mgasps=558.632 number=21,153,431 hash=0x0c7872b698f28cb5c36a8a3e1e315b1d31bda6109b15467a9735a12380e2ad14 dirty= " 0.00 B "
启动geth
的内置交互式 JavaScript 控制台(通过尾随console
命令),您可以通过它使用web3
方法进行交互(注意: geth
中捆绑的web3
版本非常旧,并且与官方文档不同步),以及geth
自己的管理 API。该工具是可选的,如果您省略它,您始终可以使用geth attach
附加到已经运行的geth
实例。
有关运行节点和成为验证者的更多详细信息
注意:虽然一些内部保护措施阻止交易在主网络和测试网络之间交叉,但您应该始终使用单独的账户进行游戏和真实货币。除非您手动移动帐户,否则geth
默认情况下会正确分隔两个网络,并且不会在它们之间提供任何帐户。
作为将众多标志传递给geth
二进制文件的替代方法,您还可以通过以下方式传递配置文件:
$ geth --config /path/to/your_config.toml
要了解文件的外观,您可以使用dumpconfig
命令导出现有配置:
$ geth --your-favourite-flags dumpconfig
geth
节点作为一名开发人员,您迟早会希望通过自己的程序开始与geth
和 BSC 网络交互,而不是通过控制台手动进行交互。为此, geth
内置了对基于 JSON-RPC 的 API(标准 API 和geth
特定 API)的支持。这些可以通过 HTTP、WebSockets 和 IPC(基于 UNIX 的平台上的 UNIX 套接字,以及 Windows 上的命名管道)公开。
IPC 接口默认启用,并公开geth
支持的所有 API,而 HTTP 和 WS 接口则需要手动启用,并且出于安全原因仅公开部分 API。这些可以按照您的预期打开/关闭和配置。
基于 HTTP 的 JSON-RPC API 选项:
--http
启用HTTP-RPC服务器--http.addr
HTTP-RPC 服务器监听接口(默认: localhost
)--http.port
HTTP-RPC 服务器监听端口(默认: 8545
)--http.api
通过 HTTP-RPC 接口提供 API(默认: eth,net,web3
)--http.corsdomain
逗号分隔的接受跨源请求的域列表(浏览器强制执行)--ws
启用 WS-RPC 服务器--ws.addr
WS-RPC 服务器监听接口(默认: localhost
)--ws.port
WS-RPC 服务器监听端口(默认: 8546
)--ws.api
通过 WS-RPC 接口提供 API(默认值: eth,net,web3
)--ws.origins
接受 WebSocket 请求的来源--ipcdisable
禁用 IPC-RPC 服务器--ipcapi
API 通过 IPC-RPC 接口提供(默认: admin,debug,eth,miner,net,personal,txpool,web3
)--ipcpath
数据目录中 IPC 套接字/管道的文件名(显式路径转义它)您需要使用自己的编程环境功能(库、工具等)通过 HTTP、WS 或 IPC 连接到配置有上述标志的geth
节点,并且您需要在所有传输上使用 JSON-RPC。您可以为多个请求重复使用同一个连接!
注意:在这样做之前,请先了解开放基于 HTTP/WS 的传输的安全影响!互联网上的黑客正在积极尝试利用暴露的 API 来破坏 BSC 节点!此外,所有浏览器选项卡都可以访问本地运行的 Web 服务器,因此恶意网页可能会尝试破坏本地可用的 API!
引导节点是超轻量级节点,不位于 NAT 之后,仅运行发现协议。当您启动节点时,它应该记录您的 enode,这是其他人可以用来连接到您的节点的公共标识符。
首先 bootnode 需要一个密钥,可以使用以下命令创建密钥,该命令会将密钥保存到 boot.key:
bootnode -genkey boot.key
然后可以使用该密钥生成引导节点,如下所示:
bootnode -nodekey boot.key -addr :30311 -network bsc
传递给 -addr 的端口选择是任意的。 bootnode 命令将以下日志返回到终端,确认其正在运行:
enode://3063d1c9e1b824cfbb7c7b6abafa34faec6bb4e7e06941d218d760acdd7963b274278c5c3e63914bd6d1b58504c59ec5522c56f883baceb8538674b92da48a96@127.0.0.1:0?discport=30311
Note: you're using cmd/bootnode, a developer tool.
We recommend using a regular node as bootstrap node for production deployments.
INFO [08-21|11:11:30.687] New local node record seq=1,692,616,290,684 id=2c9af1742f8f85ce ip= udp=0 tcp=0
INFO [08-21|12:11:30.753] New local node record seq=1,692,616,290,685 id=2c9af1742f8f85ce ip=54.217.128.118 udp=30311 tcp=0
INFO [09-01|02:46:26.234] New local node record seq=1,692,616,290,686 id=2c9af1742f8f85ce ip=34.250.32.100 udp=30311 tcp=0
感谢您考虑帮助提供源代码!我们欢迎互联网上任何人的贡献,并且即使是最小的修复也非常感激!
如果您想为 bsc 做出贡献,请分叉、修复、提交并向维护者发送拉取请求,以供维护人员审查并合并到主代码库中。如果您希望提交更复杂的更改,请首先在我们的 Discord 频道上与核心开发人员联系,以确保这些更改符合项目的总体理念和/或获得一些早期反馈,这可以使您的努力更加有效更轻,我们的审查和合并程序又快又简单。
请确保您的贡献符合我们的编码指南:
master
分支打开。请参阅开发人员指南,了解有关配置环境、管理项目依赖项和测试过程的更多详细信息。
bsc 库(即cmd
目录之外的所有代码)根据 GNU Lesser General Public License v3.0 获得许可,也包含在我们的存储库中的COPYING.LESSER
文件中。
bsc 二进制文件(即cmd
目录内的所有代码)根据 GNU 通用公共许可证 v3.0 获得许可,也包含在我们的存储库中的COPYING
文件中。