BNB 스마트 체인의 목표는 BNB 비콘 체인에 프로그래밍 가능성과 상호 운용성을 제공하는 것입니다. 기존의 인기 있는 커뮤니티와 고급 기술을 수용하기 위해 Ethereum 및 Ethereum 도구에 대한 기존의 모든 스마트 계약과의 호환성을 유지함으로써 큰 이점을 가져올 것입니다. 그리고 이를 달성하기 위한 가장 쉬운 해결책은 Go-Ethereum 포크를 기반으로 개발하는 것입니다. 우리는 Ethereum의 위대한 작업을 매우 존중하기 때문입니다.
BNB 스마트 체인은 고이더리움 포크를 기반으로 개발을 시작합니다. 따라서 "geth"라는 이름과 같이 Ethereum을 기반으로 하는 많은 도구, 바이너리 및 문서를 볼 수 있습니다.
그러나 EVM 호환 기준에서 BNB 스마트 체인은 짧은 블록 시간과 낮은 수수료를 지원할 수 있는 PoSA(지분 권위 증명) 합의를 갖춘 21명의 검증인 시스템을 도입합니다. 가장 많이 스테이킹된 검증인 후보는 검증인이 되어 블록을 생성하게 됩니다. 이중 기호 감지 및 기타 슬래싱 논리는 보안, 안정성 및 체인 최종성을 보장합니다.
BNB 스마트 체인은 다음과 같습니다:
자세한 내용은 백서에서 확인하세요.
작업 증명(PoW)은 분산형 네트워크를 구현하기 위한 실용적인 메커니즘으로 승인되었지만 환경 친화적이지 않으며 보안을 유지하기 위해 대규모 참여자가 필요합니다.
PoA(Proof-of-Authority)는 특정 수준의 비잔틴 플레이어(악의 또는 해킹)에 대한 향상된 효율성과 내성을 통해 51% 공격에 대한 일부 방어를 제공합니다. 한편, PoA 프로토콜은 검증자, 즉 블록을 교대로 생성하는 노드가 모든 권한을 갖고 부패 및 보안 공격에 취약하기 때문에 PoW만큼 분산화되지 않았다는 점에서 가장 비판을 받습니다.
EOS 및 Cosmos와 같은 다른 블록체인에서는 토큰 보유자가 검증자 세트에 투표하고 선출할 수 있도록 다양한 유형의 DPoS(대리 지분 증명)를 도입합니다. 이는 분권화를 증가시키고 커뮤니티 거버넌스를 선호합니다.
합의를 위해 DPoS와 PoA를 결합하기 위해 BNB 스마트 체인은 Parlia라는 새로운 합의 엔진을 구현합니다.
BNB는 ETH가 이더리움에서 실행되는 것과 동일한 방식으로 BNB 스마트 체인에서 실행되므로 BSC의 native token
으로 유지됩니다. 즉, BNB는 다음 용도로 사용됩니다.
gas
지불합니다. 아래의 대부분은 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 | Ethereum 계약 정의를 사용하기 쉽고 컴파일 타임에 안전한 Go 패키지로 변환하는 소스 코드 생성기입니다. 계약 바이트코드도 사용할 수 있는 경우 확장된 기능을 갖춘 일반 Ethereum 계약 ABI에서 작동합니다. 그러나 Solidity 소스 파일도 허용하므로 개발이 훨씬 더 간소화됩니다. 자세한 내용은 네이티브 DApp 페이지를 참조하세요. |
bootnode | 네트워크 노드 검색 프로토콜에만 참여하고 더 높은 수준의 애플리케이션 프로토콜을 실행하지 않는 Ethereum 클라이언트 구현의 간단한 버전입니다. 개인 네트워크에서 피어를 찾는 데 도움이 되는 경량 부트스트랩 노드로 사용할 수 있습니다. |
evm | 구성 가능한 환경 및 실행 모드 내에서 바이트코드 조각을 실행할 수 있는 EVM(Ethereum Virtual Machine)의 개발자 유틸리티 버전입니다. 그 목적은 EVM opcode(예: evm --code 60ff60ff --debug run )의 격리되고 세분화된 디버깅을 허용하는 것입니다. |
rlpdump | 바이너리 RLP(Recursive Length Prefix) 덤프(Ethereum 프로토콜에서 네트워크와 합의 방식 모두에서 사용하는 데이터 인코딩)를 사용자 친화적인 계층적 표현(예: 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 "
web3
메소드를 사용하여 상호작용할 수 있는 geth
의 내장된 대화형 JavaScript 콘솔(후행 console
하위 명령을 통해)을 시작하십시오(참고: 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, 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
datadir 내의 IPC 소켓/파이프에 대한 파일 이름(명시적 경로는 이를 이스케이프합니다) HTTP, WS 또는 IPC를 통해 위 플래그로 구성된 geth
노드에 연결하려면 자체 프로그래밍 환경의 기능(라이브러리, 도구 등)을 사용해야 하며 모든 전송에서 JSON-RPC를 사용해야 합니다. 여러 요청에 대해 동일한 연결을 재사용할 수 있습니다!
참고: 그렇게 하기 전에 HTTP/WS 기반 전송을 열 때 보안에 미치는 영향을 이해하십시오! 인터넷상의 해커들은 노출된 API를 사용하여 BSC 노드를 전복시키려고 적극적으로 노력하고 있습니다! 또한 모든 브라우저 탭은 로컬로 실행되는 웹 서버에 액세스할 수 있으므로 악의적인 웹 페이지가 로컬에서 사용 가능한 API를 파괴하려고 시도할 수 있습니다.
부트노드는 NAT 뒤에 있지 않고 검색 프로토콜만 실행하는 초경량 노드입니다. 노드를 시작하면 다른 사람이 노드에 연결하는 데 사용할 수 있는 공개 식별자인 enode를 기록해야 합니다.
먼저 부트노드에는 다음 명령을 사용하여 생성할 수 있는 키가 필요합니다. 이 키는 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 General Public License v3.0에 따라 라이센스가 부여되며 COPYING
파일의 저장소에도 포함되어 있습니다.