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
檔案中。