Цель BNB Smart Chain — обеспечить программируемость и совместимость BNB Beacon Chain. Чтобы охватить существующее популярное сообщество и передовые технологии, он принесет огромные преимущества, оставаясь совместимым со всеми существующими смарт-контрактами на Ethereum и инструментами Ethereum. И для достижения этой цели самым простым решением является разработка на основе форка go-ethereum, поскольку мы очень уважаем великую работу Ethereum.
BNB Smart Chain начинает разработку на основе форка go-ethereum. Таким образом, вы можете увидеть, что многие инструменты, двоичные файлы и документы основаны на Ethereum, например, имя «geth».
Но исходя из этой базовой совместимости с EVM, BNB Smart Chain представляет систему из 21 валидатора с консенсусом Proof of Staked Authority (PoSA), который может поддерживать короткое время блокировки и более низкие комиссии. Наиболее связанные валидаторы-кандидаты на стейкинг станут валидаторами и будут производить блоки. Обнаружение двойного знака и другая логика разделения гарантируют безопасность, стабильность и завершенность цепочки.
Смарт-цепочка BNB будет:
Более подробная информация в Белой книге.
Хотя Proof-of-Work (PoW) был одобрен в качестве практического механизма реализации децентрализованной сети, он небезопасен для окружающей среды, а также требует большого количества участников для поддержания безопасности.
Доказательство авторизации (PoA) обеспечивает некоторую защиту от атаки 51%, с повышенной эффективностью и устойчивостью к определенным уровням византийских игроков (злонамеренных или взломанных). Между тем, протокол PoA больше всего критикуют за то, что он не так децентрализован, как PoW, поскольку валидаторы, то есть узлы, которые по очереди производят блоки, обладают всеми полномочиями и склонны к коррупции и атакам на безопасность.
Другие блокчейны, такие как EOS и Cosmos, вводят различные типы заместительного доказательства доли (DPoS), позволяющие держателям токенов голосовать и выбирать набор валидаторов. Это увеличивает децентрализацию и способствует управлению сообществом.
Чтобы объединить DPoS и PoA для достижения консенсуса, BNB Smart Chain реализует новый механизм консенсуса под названием Parlia, который:
BNB будет работать на BNB Smart Chain так же, как ETH работает на Ethereum, поэтому он останется native token
для BSC. Это означает, что 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 Smart Chain. Это точка входа в сеть BSC (основная, тестовая или частная сеть), способная работать как полный узел (по умолчанию), архивный узел (сохраняющий все историческое состояние) или легкий узел (получающий данные в реальном времени). Он имеет тот же или больше RPC и другой интерфейс, что и go-ethereum, и может использоваться другими процессами в качестве шлюза в сети BSC через конечные точки JSON RPC, предоставляемые поверх транспортов HTTP, WebSocket и/или IPC. geth --help и страница CLI для параметров командной строки. |
clef | Автономный инструмент подписи, который можно использовать в качестве внутреннего подписывающего устройства для geth . |
devp2p | Утилиты для взаимодействия с узлами на сетевом уровне без запуска полного блокчейна. |
abigen | Генератор исходного кода для преобразования определений контрактов Ethereum в простые в использовании, типобезопасные пакеты Go во время компиляции. Он работает на простых ABI контрактов Ethereum с расширенной функциональностью, если байт-код контракта также доступен. Однако он также принимает исходные файлы Solidity, что значительно упрощает разработку. Подробную информацию можно найти на нашей странице «Нативные DApps». |
bootnode | Урезанная версия нашей реализации клиента Ethereum, которая участвует только в протоколе обнаружения сетевых узлов, но не запускает ни один из протоколов приложений более высокого уровня. Его можно использовать в качестве облегченного узла начальной загрузки, помогающего находить одноранговые узлы в частных сетях. |
evm | Версия утилиты разработчика EVM (виртуальной машины Ethereum), которая способна запускать фрагменты байт-кода в настраиваемой среде и режиме выполнения. Его цель — обеспечить изолированную, детальную отладку кодов операций EVM (например, evm --code 60ff60ff --debug run ). |
rlpdump | Утилита разработчика для преобразования двоичных дампов RLP (префикс рекурсивной длины) (кодировка данных, используемая протоколом Ethereum как в сети, так и в соответствии с консенсусом) в более удобное для пользователя иерархическое представление (например, rlpdump --hex CE0183FFFFFFC4C304050583616263 ). |
geth
Перебор всех возможных флагов командной строки здесь выходит за рамки (см. нашу Wiki-страницу CLI), но мы перечислили несколько распространенных комбинаций параметров, которые помогут вам быстро освоить запуск собственного экземпляра 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 "
Запустите встроенную интерактивную консоль JavaScript geth
(через завершающую подкоманду console
), с помощью которой вы можете взаимодействовать с помощью методов web3
(примечание: версия web3
, включенная в geth
, очень старая и не соответствует официальной документации), а также собственные API управления geth
. Этот инструмент является необязательным, и если вы его опустите, вы всегда сможете подключиться к уже работающему экземпляру geth
с помощью geth attach
.
Более подробная информация о запуске узла и о том, как стать валидатором
Примечание. Хотя некоторые внутренние защитные меры предотвращают пересечение транзакций между основной сетью и тестовой сетью, вам всегда следует использовать отдельные учетные записи для игры и реальных денег. Если вы не переместите учетные записи вручную, geth
по умолчанию правильно разделит две сети и не сделает доступными какие-либо учетные записи между ними.
В качестве альтернативы передаче многочисленных флагов в двоичный файл geth
вы также можете передать файл конфигурации через:
$ geth --config /path/to/your_config.toml
Чтобы получить представление о том, как должен выглядеть файл, вы можете использовать подкоманду dumpconfig
для экспорта существующей конфигурации:
$ geth --your-favourite-flags dumpconfig
geth
Как разработчик, рано или поздно вы захотите начать взаимодействовать с geth
и сетью BSC через свои собственные программы, а не вручную через консоль. Чтобы помочь этому, geth
имеет встроенную поддержку API на основе JSON-RPC (стандартных API и API, специфичных для geth
). Их можно предоставлять через HTTP, WebSockets и IPC (сокеты UNIX на платформах на базе UNIX и именованные каналы в Windows).
Интерфейс IPC включен по умолчанию и предоставляет все API, поддерживаемые geth
, тогда как интерфейсы HTTP и WS необходимо включать вручную и предоставлять только подмножество API по соображениям безопасности. Их можно включать/выключать и настраивать так, как вы ожидаете.
Параметры API JSON-RPC на основе HTTP:
--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 в каталоге данных (явные пути обходят его) Вам нужно будет использовать возможности вашей собственной среды программирования (библиотеки, инструменты и т. д.) для подключения через HTTP, WS или IPC к узлу geth
, настроенному с указанными выше флагами, и вам нужно будет использовать JSON-RPC на всех транспортах. Вы можете повторно использовать одно и то же соединение для нескольких запросов!
Примечание. Прежде чем делать это, ознакомьтесь с последствиями для безопасности открытия транспорта на основе HTTP/WS! Хакеры в Интернете активно пытаются взломать узлы BSC с открытыми API! Кроме того, все вкладки браузера могут получить доступ к локально работающим веб-серверам, поэтому вредоносные веб-страницы могут попытаться подорвать локально доступные 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
.