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 apuestas 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á:
Una cadena de bloques autosoberana : proporciona seguridad y protección con validadores elegidos.
Compatible con EVM : admite todas las herramientas existentes de Ethereum junto con una finalidad más rápida y tarifas de transacción más económicas.
Distribuido con gobernanza en cadena : la prueba de autoridad estacada atrae la descentralización y los participantes de la comunidad. Como token nativo, BNB servirá como gas para la ejecución de contratos inteligentes y como tokens para apostar.
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:
Los bloques son producidos por un conjunto limitado de validadores.
Los validadores se turnan para producir bloques en forma de PoA, similar al motor de consenso Clique de Ethereum.
El conjunto de validadores se elige dentro y fuera según una gobernanza basada en apuestas en BNB Smart Chain.
El motor de consenso de Parlia interactuará con un conjunto de contratos del sistema para lograr una función de reducción de vida, distribución de ingresos y renovación del conjunto de validadores.
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:
pagar 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
hacer geth
o, para crear el conjunto completo de utilidades:
hacer todo
Si recibe dicho error al ejecutar el nodo con un binario autoconstruido:
Captó SIGILL en blst_cgo_init, consulte <blst>/bindinds/go/README.md.
intente agregar las siguientes variables de entorno y vuelva a compilar:
exportar CGO_CFLAGS="-O -D__BLST_PORTABLE__" exportar 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 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:
VPS que ejecuta versiones recientes de Mac OS X, Linux o Windows.
IMPORTANTE 3 TB (diciembre de 2023) de espacio libre en disco, unidad de estado sólido (SSD), gp3, 8k IOPS, rendimiento de 500 MB/S, latencia de lectura <1 ms. (si el nodo se inicia con sincronización instantánea, necesitará NVMe SSD)
16 núcleos de CPU y 64 GB de memoria (RAM)
Sugiera el tipo de instancia m5zn.6xlarge o r7iz.4xlarge en AWS, c2-standard-16 en la nube de Google.
Una conexión a Internet de banda ancha con velocidades de carga/descarga de 5 MB/S
El requisito para la red de prueba:
VPS que ejecuta versiones recientes de Mac OS X, Linux o Windows.
500G de almacenamiento para testnet.
4 núcleos de CPU y 16 gigabytes de memoria (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 geth chmod -v u+x geth
//== red principal wget $(curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest |grep browser_ |grep mainnet |cut -d" -f4)descomprimir mainnet.zip //== red de prueba wget $(curl -s https://api.github.com/repos/bnb-chain/bsc/releases/latest |grep browser_ |grep testnet |cut -d" -f4)descomprimir 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## Se recomienda ejecutar fullnode con `--tries- modo de verificación ninguno` si desea un alto rendimiento y le importa poco la coherencia del estado## Se ejecutará con el esquema de almacenamiento Hash-Base de forma predeterminada./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode none## Ejecuta el nodo completo con el esquema de almacenamiento Path-Base. ## Permitirá la poda de estado en línea, manteniendo el estado del historial de los últimos 90000 bloques de forma predeterminada../geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0 --tries-verify-mode ninguno --state.scheme ruta
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="Nuevo segmento de cadena importado" bloques=1 txs=177 mgas=17.317 transcurrido=31.131ms mgasps=556.259 número=21,153,429 hash=0x42e6b54ba7106387f0650defc62c9ace3160b427702dab7bd1c5abb83a32d8db dirty="0.00 B"t=2022-09-08T13:00:29+0000 lvl=info msg="Nuevo segmento de cadena importado" bloques=1 txs=251 mgas=39.638 transcurrido=68.827ms mgasps=575.900 número=21,153,430 hash=0xa3397b273b31b013e43487689782f20c03f47525b4cd4107c1715af45a88796e dirty="0.00 B"t=2022-09-08T13:00:33+0000 lvl=info msg="Nuevo segmento de cadena importado" bloques=1 txs=197 mgas=19.364 transcurrido=34.663ms mgasps=558.632 número=21,153,431 hash=0x0c7872b698f28cb5c36a8a3e1e315b1d31bda6109b15467a9735a12380e2ad14 sucio="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 /ruta/a/tu_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 --tus-flags-favoritos 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.
BSC-Deploy: herramienta de implementación para configurar BNB Smart Chain.
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=<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
¡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 con 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:
El código debe cumplir con las pautas de formato oficiales de Go (es decir, utiliza gofmt).
El código debe documentarse siguiendo las pautas oficiales de comentarios de Go.
Las solicitudes de extracción deben basarse y abrirse en la rama master
.
Los mensajes de confirmación deben tener como prefijo los paquetes que modifican.
Por ejemplo, "eth, rpc: hacer que las configuraciones de seguimiento sean opcionales"
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 GNU Lesser General Public License 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
.