El objetivo de BNB Smart Chain es brindar programabilidad e interoperabilidad a BNB Beacon Chain. Para adoptar la comunidad popular existente y la tecnología avanzada, traerá enormes beneficios al seguir siendo compatible con todos los contratos inteligentes existentes en Ethereum y las herramientas de Ethereum. Y para lograrlo, la solución más sencilla es desarrollar en base a la bifurcación go-ethereum, ya que respetamos mucho el gran trabajo de Ethereum.
BNB Smart Chain comienza su desarrollo basado en la bifurcación go-ethereum. Por lo tanto, es posible que vea que muchas herramientas, binarios y también documentos se basan en los de Ethereum, como el nombre "geth".
Pero a partir de esa base de compatibilidad con EVM, BNB Smart Chain introduce un sistema de 21 validadores con consenso de Prueba de autoridad estacada (PoSA) que puede admitir tiempos de bloqueo cortos y tarifas más bajas. Los candidatos a validadores de participación más vinculados se convertirán en validadores y producirán bloques. La detección de doble señal y otra lógica de corte garantizan la seguridad, la estabilidad y la finalidad de la cadena.
La BNB Smart Chain será:
Más detalles en Libro Blanco.
Aunque la Prueba de Trabajo (PoW) ha sido aprobada como un mecanismo práctico para implementar una red descentralizada, no es amigable con el medio ambiente y además requiere un gran tamaño de participantes para mantener la seguridad.
La prueba de autoridad (PoA) proporciona cierta defensa contra un 51% de ataques, con eficiencia y tolerancia mejoradas para ciertos niveles de jugadores bizantinos (maliciosos o pirateados). Mientras tanto, el protocolo PoA es el más criticado por no ser tan descentralizado como PoW, ya que los validadores, es decir, los nodos que se turnan para producir bloques, tienen todas las autoridades y son propensos a la corrupción y los ataques a la seguridad.
Otras cadenas de bloques, como EOS y Cosmos, introducen diferentes tipos de Prueba de participación adjunta (DPoS) para permitir a los poseedores de tokens votar y elegir el conjunto de validadores. Incrementa la descentralización y favorece la gobernanza comunitaria.
Para combinar DPoS y PoA para lograr consenso, BNB Smart Chain implementa un novedoso motor de consenso llamado Parlia que:
BNB se ejecutará en BNB Smart Chain de la misma manera que ETH se ejecuta en Ethereum, de modo que permanezca como native token
para BSC. Esto significa que BNB se utilizará para:
gas
para implementar o invocar un contrato inteligente en BSC Muchos de los siguientes son iguales o similares a go-ethereum.
Para conocer los requisitos previos y las instrucciones de construcción detalladas, lea las Instrucciones de instalación.
La compilación de geth
requiere un compilador Go (versión 1.21 o posterior) y C (GCC 5 o superior). Puede instalarlos usando su administrador de paquetes favorito. Una vez instaladas las dependencias, ejecute
make geth
o, para crear el conjunto completo de utilidades:
make all
Si recibe dicho error al ejecutar el nodo con un binario autoconstruido:
Caught SIGILL in blst_cgo_init, consult < blst > /bindinds/go/README.md.
intente agregar las siguientes variables de entorno y vuelva a compilar:
export CGO_CFLAGS= " -O -D__BLST_PORTABLE__ "
export CGO_CFLAGS_ALLOW= " -O -D__BLST_PORTABLE__ "
El proyecto bsc viene con varios contenedores/ejecutables que se encuentran en el directorio cmd
.
Dominio | Descripción |
---|---|
geth | Binario principal del cliente BNB Smart Chain. Es el punto de entrada a la red BSC (red principal, de prueba o privada), capaz de ejecutarse como un nodo completo (predeterminado), un nodo de archivo (que conserva todo el estado histórico) o un nodo ligero (que recupera datos en vivo). Tiene el mismo y más RPC y otras interfaces que go-ethereum y puede ser utilizado por otros procesos como puerta de enlace a la red BSC a través de puntos finales JSON RPC expuestos sobre transportes HTTP, WebSocket y/o IPC. geth --help y la página CLI para opciones de línea de comando. |
clef | Herramienta de firma independiente, que se puede utilizar como firmante backend para geth . |
devp2p | Utilidades para interactuar con nodos en la capa de red, sin ejecutar una cadena de bloques completa. |
abigen | Generador de código fuente para convertir definiciones de contratos de Ethereum en paquetes Go fáciles de usar y con seguridad de tipos en tiempo de compilación. Opera en ABI de contrato simple de Ethereum con funcionalidad ampliada si el código de bytes del contrato también está disponible. Sin embargo, también acepta archivos fuente de Solidity, lo que simplifica mucho el desarrollo. Consulte nuestra página de DApps nativas para obtener más detalles. |
bootnode | Versión simplificada de nuestra implementación de cliente Ethereum que solo participa en el protocolo de descubrimiento de nodos de red, pero no ejecuta ninguno de los protocolos de aplicación de nivel superior. Se puede utilizar como un nodo de arranque ligero para ayudar a encontrar pares en redes privadas. |
evm | Versión de utilidad para desarrolladores de EVM (Ethereum Virtual Machine) que es capaz de ejecutar fragmentos de código de bytes dentro de un entorno y modo de ejecución configurables. Su propósito es permitir una depuración aislada y detallada de códigos de operación EVM (por ejemplo, evm --code 60ff60ff --debug run ). |
rlpdump | Herramienta de utilidad para desarrolladores para convertir volcados binarios RLP (prefijo de longitud recursiva) (codificación de datos utilizada por el protocolo Ethereum tanto en red como en consenso) en una representación jerárquica más fácil de usar (por ejemplo, rlpdump --hex CE0183FFFFFFC4C304050583616263 ). |
geth
Revisar todos los indicadores de línea de comando posibles está fuera de nuestro alcance aquí (consulte nuestra página CLI Wiki), pero hemos enumerado algunas combinaciones de parámetros comunes para que pueda ponerse al día rápidamente sobre cómo puede ejecutar su propia instancia geth
.
El hardware debe cumplir ciertos requisitos para ejecutar un nodo completo en la red principal:
El requisito para la red de prueba:
# 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
Descargue la última instantánea de Chaindata desde aquí. Siga la guía para estructurar sus archivos.
./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
Supervise el registro desde ./node/bsc.log de forma predeterminada. Cuando el nodo haya comenzado a sincronizarse, debería poder ver el siguiente resultado:
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 "
Inicie la consola JavaScript interactiva incorporada de geth
(a través del subcomando console
final) a través de la cual puede interactuar utilizando métodos web3
(nota: la versión web3
incluida en geth
es muy antigua y no está actualizada con los documentos oficiales). así como las API de administración propias de geth
. Esta herramienta es opcional y, si la omite, siempre puede adjuntarla a una instancia geth
que ya se esté ejecutando con geth attach
.
Más detalles sobre cómo ejecutar un nodo y convertirse en validador
Nota: Aunque algunas medidas de protección internas evitan que las transacciones se crucen entre la red principal y la red de prueba, siempre debes usar cuentas separadas para jugar y para dinero real. A menos que mueva cuentas manualmente, geth
separará correctamente las dos redes de forma predeterminada y no permitirá que ninguna cuenta esté disponible entre ellas.
Como alternativa a pasar los numerosos indicadores al binario geth
, también puedes pasar un archivo de configuración a través de:
$ geth --config /path/to/your_config.toml
Para tener una idea de cómo debería verse el archivo, puede usar el subcomando dumpconfig
para exportar su configuración existente:
$ geth --your-favourite-flags dumpconfig
geth
Como desarrollador, más temprano que tarde querrás comenzar a interactuar con geth
y la red BSC a través de tus propios programas y no manualmente a través de la consola. Para ayudar a esto, geth
tiene soporte integrado para API basadas en JSON-RPC (API estándar y API específicas geth
). Estos pueden exponerse a través de HTTP, WebSockets e IPC (sockets UNIX en plataformas basadas en UNIX y canalizaciones con nombre en Windows).
La interfaz IPC está habilitada de forma predeterminada y expone todas las API admitidas por geth
, mientras que las interfaces HTTP y WS deben habilitarse manualmente y solo exponen un subconjunto de API por razones de seguridad. Estos se pueden activar/desactivar y configurar como era de esperar.
Opciones de API JSON-RPC basadas en HTTP:
--http
Habilita el servidor HTTP-RPC--http.addr
Interfaz de escucha del servidor HTTP-RPC (predeterminado: localhost
)--http.port
Puerto de escucha del servidor HTTP-RPC (predeterminado: 8545
)--http.api
API ofrecidas a través de la interfaz HTTP-RPC (predeterminado: eth,net,web3
)--http.corsdomain
Lista separada por comas de dominios desde los cuales aceptar solicitudes de origen cruzado (aplicado por el navegador)--ws
Habilita el servidor WS-RPC--ws.addr
Interfaz de escucha del servidor WS-RPC (predeterminado: localhost
)--ws.port
Puerto de escucha del servidor WS-RPC (predeterminado: 8546
)--ws.api
API ofrecidas a través de la interfaz WS-RPC (predeterminado: eth,net,web3
)--ws.origins
Orígenes desde los cuales aceptar solicitudes de WebSocket--ipcdisable
Deshabilita el servidor IPC-RPC--ipcapi
API ofrecidas a través de la interfaz IPC-RPC (predeterminado: admin,debug,eth,miner,net,personal,txpool,web3
)--ipcpath
Nombre de archivo para el socket/tubería IPC dentro del directorio de datos (las rutas explícitas escapan de él) Necesitará utilizar las capacidades de su propio entorno de programación (bibliotecas, herramientas, etc.) para conectarse a través de HTTP, WS o IPC a un nodo geth
configurado con los indicadores anteriores y necesitará hablar JSON-RPC en todos los transportes. ¡Puedes reutilizar la misma conexión para múltiples solicitudes!
Nota: ¡Comprenda las implicaciones de seguridad de abrir un transporte basado en HTTP/WS antes de hacerlo! ¡Los piratas informáticos en Internet están intentando activamente subvertir los nodos BSC con API expuestas! Además, todas las pestañas del navegador pueden acceder a servidores web que se ejecutan localmente, por lo que las páginas web maliciosas podrían intentar subvertir las API disponibles localmente.
Los nodos de arranque son nodos súper livianos que no están detrás de una NAT y solo ejecutan un protocolo de descubrimiento. Cuando inicia un nodo, este debe registrar su enodo, que es un identificador público que otros pueden usar para conectarse a su nodo.
Primero, el nodo de arranque requiere una clave, que se puede crear con el siguiente comando, que guardará una clave en boot.key:
bootnode -genkey boot.key
Luego, esta clave se puede utilizar para generar un nodo de arranque de la siguiente manera:
bootnode -nodekey boot.key -addr :30311 -network bsc
La elección del puerto pasado a -addr es arbitraria. El comando bootnode devuelve los siguientes registros al terminal, confirmando que se está ejecutando:
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
¡Gracias por considerar ayudar con el código fuente! Agradecemos las contribuciones de cualquier persona en Internet y agradecemos incluso las correcciones más pequeñas.
Si desea contribuir a bsc, bifurque, corrija, confirme y envíe una solicitud de extracción para que los mantenedores la revisen y fusionen en la base del código principal. Sin embargo, si desea enviar cambios más complejos, consulte primero con los desarrolladores principales en nuestro canal de Discord para asegurarse de que esos cambios estén en línea con la filosofía general del proyecto y/o obtenga algunos comentarios tempranos que puedan hacer que ambos esfuerzos sean mucho mejores. más ligero, así como nuestros procedimientos de revisión y fusión rápidos y sencillos.
Asegúrese de que sus contribuciones cumplan con nuestras pautas de codificación:
master
.Consulte la Guía para desarrolladores para obtener más detalles sobre cómo configurar su entorno, administrar las dependencias del proyecto y los procedimientos de prueba.
La biblioteca bsc (es decir, todo el código fuera del directorio cmd
) tiene la licencia pública general reducida GNU v3.0, que también se incluye en nuestro repositorio en el archivo COPYING.LESSER
.
Los binarios de bsc (es decir, todo el código dentro del directorio cmd
) tienen la licencia pública general GNU v3.0, que también se incluye en nuestro repositorio en el archivo COPYING
.