BNB スマート チェーンの目標は、BNB ビーコン チェーンにプログラマビリティと相互運用性をもたらすことです。既存の人気のあるコミュニティと高度なテクノロジーを受け入れるために、イーサリアム上の既存のすべてのスマートコントラクトとイーサリアムツールとの互換性を維持することで、大きなメリットがもたらされます。そしてそれを達成するための最も簡単な解決策は、イーサリアムの偉大な取り組みを非常に尊重しているため、go-イーサリアム フォークに基づいて開発することです。
BNB スマート チェーンは、ゴーイーサリアム フォークに基づいて開発を開始します。そのため、多くのツール、バイナリ、そしてドキュメントも、「geth」という名前など、イーサリアムのものに基づいていることがわかります。
しかし、EVM互換のベースラインから、BNBスマートチェーンは、短いブロック時間とより低い料金をサポートできるProof of Staked Authority(PoSA)コンセンサスを備えた21のバリデーターのシステムを導入しています。ステーキングの最も結合されたバリデーター候補がバリデーターとなり、ブロックを生成します。二重符号の検出とその他のスラッシュ ロジックにより、セキュリティ、安定性、チェーンのファイナリティが保証されます。
BNB スマート チェーンは次のようになります。
自己主権型ブロックチェーン: 選出されたバリデーターによりセキュリティと安全性を提供します。
EVM 互換: 既存のイーサリアム ツールをすべてサポートし、ファイナリティの高速化とトランザクション手数料の削減を実現します。
オンチェーンガバナンスによる分散型: Proof of Staked Authority は分散化とコミュニティ参加者をもたらします。ネイティブ トークンとして、BNB はスマート コントラクト実行のガスとステーキング用のトークンの両方として機能します。
詳細についてはホワイトペーパーをご覧ください。
Proof-of-Work (PoW) は分散型ネットワークを実装するための実用的なメカニズムとして承認されていますが、環境に優しくなく、またセキュリティを維持するために大規模な参加者が必要です。
Proof-of-Authority(PoA) は、51% 攻撃に対するある程度の防御を提供し、効率と特定レベルのビザンチン プレーヤー (悪意のあるまたはハッキングされた) に対する耐性を向上させます。一方、PoA プロトコルは、バリデータ、つまり順番にブロックを生成するノードがすべての権限を持ち、破損やセキュリティ攻撃を受けやすいため、PoW ほど分散化されていないことが最も批判されています。
EOS や Cosmos などの他のブロックチェーンは、トークン所有者が投票してバリデーター セットを選択できるようにするために、さまざまなタイプの Deputy Proof of Stake (DPoS) を導入しています。それは分散化を促進し、コミュニティのガバナンスを促進します。
コンセンサスのために DPoS と PoA を組み合わせるために、BNB スマート チェーンは、次のような Parlia と呼ばれる新しいコンセンサス エンジンを実装します。
ブロックは、限られたバリデーターのセットによって生成されます。
バリデーターは、イーサリアムのクリーク コンセンサス エンジンと同様に、PoA 方式で順番にブロックを生成します。
バリデーターセットは、BNBスマートチェーン上のステーキングベースのガバナンスに基づいて選出されます。
Parlia コンセンサス エンジンは、一連のシステム コントラクトと対話して、ライブネス スラッシュ、収益分配、およびバリデータ セット更新機能を実現します。
BNBは、ETHがイーサリアム上で実行されるのと同じ方法でBNBスマートチェーン上で実行されるため、BSCのnative token
として残ります。つまり、BNB は次の目的で使用されます。
BSC でスマート コントラクトを展開または呼び出すためにgas
支払う
以下の多くは go-ethereum と同じか類似しています。
前提条件と詳細な構築手順については、インストール手順を参照してください。
geth
ビルドするには、Go (バージョン 1.21 以降) と C コンパイラー (GCC 5 以降) の両方が必要です。お気に入りのパッケージ マネージャーを使用してインストールできます。依存関係がインストールされたら、実行します
ゲスを作る
または、ユーティリティの完全なスイートを構築するには:
全部作る
自己構築バイナリでノードを実行しているときにこのようなエラーが発生した場合:
blst_cgo_init で SIGILL をキャッチしました。<blst>/bindinds/go/README.md を参照してください。
次の環境変数を追加して、再度ビルドしてみてください。
エクスポート CGO_CFLAGS="-O -D__BLST_PORTABLE__" エクスポート 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 | Ethereum コントラクト定義を使いやすく、コンパイル時にタイプセーフな Go パッケージに変換するソース コード ジェネレーター。コントラクトのバイトコードも利用可能な場合は、拡張機能を備えたプレーンなイーサリアム コントラクト ABI 上で動作します。ただし、Solidity ソース ファイルも受け入れるため、開発がより合理化されます。詳細については、ネイティブ DApps ページをご覧ください。 |
bootnode | ネットワーク ノード検出プロトコルにのみ参加し、上位レベルのアプリケーション プロトコルは実行しない、イーサリアム クライアント実装の機能を取り除いたバージョン。これは、プライベート ネットワーク内のピアの検索を支援する軽量のブートストラップ ノードとして使用できます。 |
evm | 構成可能な環境および実行モード内でバイトコード スニペットを実行できる EVM (イーサリアム仮想マシン) の開発者ユーティリティ バージョン。その目的は、EVM オペコードの分離されたきめ細かいデバッグを可能にすることです (例: evm --code 60ff60ff --debug run )。 |
rlpdump | バイナリ RLP (Recursive Length Prefix) ダンプ (ネットワークとコンセンサスの両方でイーサリアム プロトコルで使用されるデータ エンコーディング) を、より使いやすい階層表現 (例: rlpdump --hex CE0183FFFFFFC4C304050583616263 ) に変換する開発者ユーティリティ ツール。 |
geth
考えられるすべてのコマンド ライン フラグを検討することはここでは範囲外です (CLI Wiki ページを参照してください) が、独自のgeth
インスタンスを実行する方法をすぐに理解できるように、いくつかの一般的なパラメーターの組み合わせを列挙しました。
メインネット上でフルノードを実行するには、ハードウェアが特定の要件を満たしている必要があります。
Mac OS X、Linux、または Windows の最新バージョンを実行する VPS。
重要 3 TB (2023 年 12 月) の空きディスク容量、ソリッド ステート ドライブ (SSD)、gp3、8k IOPS、500 MB/S スループット、読み取り遅延 <1ms。 (ノードがスナップ同期で起動される場合、NVMe SSD が必要になります)
16 コアの CPU と 64 GB のメモリ (RAM)
AWS では m5zn.6xlarge または r7iz.4xlarge インスタンス タイプ、Google クラウドでは c2-standard-16 を提案します。
アップロード/ダウンロード速度 5 MB/秒のブロードバンド インターネット接続
テストネットの要件:
Mac OS X、Linux、または Windows の最新バージョンを実行する VPS。
テストネット用の 500G のストレージ。
4コアのCPUと16ギガバイトのメモリ(RAM)。
# Linuxwget $(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# MacOSwget $(curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest |grep browser_ |grep geth_mac |cut -d" -f4)mv geth_macos ゲス chmod -v u+x geth
//== メインネット wget $(curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest |grep browser_ |grep mainnet |cut -d" -f4)mainnet.zip を解凍します //== テストネット wget $(curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest |grep browser_ |grep testnet |cut -d" -f4)testnet.zip を解凍します
最新のチェーンデータスナップショットをここからダウンロードします。ガイドに従ってファイルを構造化します。
./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0## `--tries- を指定して fullnode を実行することをお勧めします。 verify-mode none` 高いパフォーマンスを望み、状態の一貫性をあまり気にしない場合## デフォルトではハッシュベース ストレージ スキームで実行されます。/geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode none## パスベースのストレージ スキームでフルノードを実行します。 ## インライン状態のプルーンが有効になり、デフォルトで最新の 90000 ブロックの履歴状態が保持されます。./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode none --state.scheme パス
デフォルトでは、 ./node/bsc.logからログを監視します。ノードが同期を開始すると、次の出力が表示されるはずです。
t=2022-09-08T13:00:27+0000 lvl=info msg="インポートされた新しいチェーン セグメント" ブロック=1 txs=177 mgas=17.317 経過=31.131ミリ秒 mgasps=556.259 数値=21,153,429 hash=0x42e6b54ba7106387f0650defc62c9ace3160b427702dab7bd1c5abb83a32d8db Dirty="0.00 B"t=2022-09-08T13:00:29+0000 lvl=info msg="インポートされた新しいチェーン セグメント" ブロック=1 txs=251 mgas=39.638 経過=68.827ms mgasps=575.900 数値=21,153,430 ハッシュ=0xa3397b273b31b013e43487689782f20c03f47525b4cd4107c1715af45a88796eダーティ = "0.00 B" t=2022-09-08T13:00:33+0000 lvl=info msg = "新しいチェーン セグメントをインポートしました" ブロック = 1 txs = 197 mgas = 19.364 経過 = 34.663 ミリ秒 mgasps = 558.632 数値 = 21,153,431ハッシュ=0x0c7872b698f28cb5c36a8a3e1e315b1d31bda6109b15467a9735a12380e2ad14 ダーティ="0.00 B"
geth
の組み込みインタラクティブ JavaScript コンソールを起動します (末尾のconsole
サブコマンド経由)。このコンソールを通じて、 web3
メソッドを使用して対話できます (注: geth
にバンドルされているweb3
バージョンは非常に古く、公式ドキュメントでは最新ではありません)。 geth
独自の管理 API も同様です。このツールはオプションであり、省略した場合でも、 geth attach
を使用して、常に実行中のgeth
インスタンスにアタッチできます。
ノードの実行とバリデーターになることについての詳細
注: 一部の内部保護対策により、メイン ネットワークとテスト ネットワーク間でトランザクションが交差することは防止されていますが、プレイ マネーとリアル マネーには常に別のアカウントを使用する必要があります。アカウントを手動で移動しない限り、 geth
デフォルトで 2 つのネットワークを正しく分離し、それらの間でアカウントを使用できるようにしません。
多数のフラグをgeth
バイナリに渡す代わりに、次の方法で構成ファイルを渡すこともできます。
$ geth --config /path/to/your_config.toml
ファイルがどのように見えるかを把握するには、 dumpconfig
サブコマンドを使用して既存の構成をエクスポートします。
$ geth --your-favorite-flags dumpconfig
geth
ノードのインターフェース開発者としては、コンソールを介して手動で行うのではなく、自分のプログラムを介して、 geth
および BSC ネットワークとの対話を遅かれ早かれ開始したいと思うでしょう。これを支援するために、 geth
JSON-RPC ベースの API (標準 API およびgeth
固有の API) のサポートが組み込まれています。これらは、HTTP、WebSocket、および 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
API は HTTP-RPC インターフェイス経由で提供されます (デフォルト: eth,net,web3
)
--http.corsdomain
クロスオリジンリクエストを受け入れるドメインのカンマ区切りリスト (ブラウザ強制)
--ws
WS-RPC サーバーを有効にします。
--ws.addr
WS-RPC サーバーのリスニング インターフェイス (デフォルト: localhost
)
--ws.port
WS-RPC サーバーのリスニング ポート (デフォルト: 8546
)
--ws.api
API は WS-RPC インターフェイス経由で提供されます (デフォルト: eth,net,web3
)
--ws.origins
WebSocket リクエストを受け入れるオリジン
--ipcdisable
IPC-RPC サーバーを無効にする
--ipcapi
API は IPC-RPC インターフェイス経由で提供されます (デフォルト: admin,debug,eth,miner,net,personal,txpool,web3
)
--ipcpath
データディレクトリ内の IPC ソケット/パイプのファイル名 (明示的なパスはそれをエスケープします)
上記のフラグで設定されたgeth
ノードに HTTP、WS、または IPC 経由で接続するには、独自のプログラミング環境の機能 (ライブラリ、ツールなど) を使用する必要があり、すべてのトランスポートで JSON-RPC を話す必要があります。複数のリクエストに対して同じ接続を再利用できます。
注: HTTP/WS ベースのトランスポートを開くことによるセキュリティへの影響を、実行する前に理解してください。インターネット上のハッカーは、公開された API を使用して BSC ノードを破壊しようと積極的に試みています。さらに、すべてのブラウザ タブはローカルで実行されている Web サーバーにアクセスできるため、悪意のある Web ページがローカルで利用可能な API を破壊しようとする可能性があります。
BSC-Deploy: BNB スマート チェーンをセットアップするためのデプロイ ツール。
ブートノードは、NAT の背後になく、検出プロトコルのみを実行する超軽量のノードです。ノードを起動すると、ノードは e ノードをログに記録する必要があります。これは、他のユーザーがノードに接続するために使用できる公開識別子です。
まず、ブートノードにはキーが必要です。キーは次のコマンドで作成でき、キーが 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=<nil> 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 チャンネルでコア開発者に確認して、それらの変更がプロジェクトの一般的な理念に沿っているかどうかを確認したり、早期のフィードバックを取得したりして、両方の努力を有効にすることができます。軽量化だけでなく、レビューとマージ手順も迅速かつ簡単に行えます。
あなたの投稿が当社のコーディング ガイドラインに従っていることを確認してください。
コードは公式の Go フォーマット ガイドラインに準拠する必要があります (つまり、gofmt を使用します)。
コードは公式の Go コメント ガイドラインに従って文書化する必要があります。
プル リクエストは、 master
ブランチに基づいてオープンする必要があります。
コミットメッセージには、変更するパッケージをプレフィックスとして付ける必要があります。
例: 「eth、rpc: トレース構成をオプションにする」
環境の構成、プロジェクトの依存関係の管理、テスト手順の詳細については、開発者ガイドを参照してください。
bsc ライブラリ (つまり、 cmd
ディレクトリの外にあるすべてのコード) は、GNU Lesser General Public License v3.0 に基づいてライセンスされており、リポジトリのCOPYING.LESSER
ファイルにも含まれています。
bsc バイナリ (つまり、 cmd
ディレクトリ内のすべてのコード) は、GNU General Public License v3.0 に基づいてライセンスされており、 COPYING
ファイルのリポジトリにも含まれています。