Por: Brett McLain, director de ingeniería - Crypto, Fiat, Staking
Si está interesado en las criptomonedas, los pagos o las apuestas y desea ayudar a construir el sistema financiero del futuro, ¡el equipo de ingeniería de financiamiento @ Kraken está contratando!
Cuando Kraken se lanzó hace una década, solo se admitían tres criptomonedas: BTC, LTC y XRP.
Hoy, Kraken admite 82 activos en 33 cadenas de bloques y servicios de participación para 8 criptomonedas.
Para facilitar los millones de depósitos, retiros y transacciones de participación al año en Kraken, el equipo de ingeniería de cifrado opera cientos de servicios para garantizar el flujo fluido de fondos dentro y fuera del intercambio. El software blockchain que sustenta estos servicios se actualiza con frecuencia; para algunas de las cadenas de bloques más activas, las bifurcaciones duras y blandas pueden ser de naturaleza mensual, mientras que otras como Ethereum son eventos dos veces al año. En general, hay al menos algunas actualizaciones de software para nuestra infraestructura blockchain cada semana.
El desafío de respaldar y actualizar una cantidad tan grande de servicios diferentes y, al mismo tiempo, crear otros nuevos puede resultar abrumador.
En los últimos 12 meses, nuestro equipo ha agregado soporte para:
- 60 nuevas criptomonedas:
- 39 x fichas ERC20
- Polkadot (en el lanzamiento de mainnet)
- Kusama
- Filecoin (en el lanzamiento de mainnet)
- Flujo (en el lanzamiento de la red principal)
- Kava
- Energy Web Token (en el lanzamiento de la red principal)
- Dólar estadounidense (TRC20)
- 10 x Crowdloans de Parachain
- Solana
- 1 x ficha SPL (suero)
- Mina
- 8 nuevos activos de participación:
- Polkadot (en el lanzamiento de mainnet)
- Kusama
- Ethereum 2.0 (en el lanzamiento de mainnet)
- Flujo (en el lanzamiento de la red principal)
- Cardano
- cosmos
- Kava
- Solana
Estos logros se lograron junto con el mantenimiento de nuestras integraciones existentes. Los ingenieros del equipo de criptografía son responsables no solo del software de puerta de enlace escrito internamente, sino también del mantenimiento y la implementación de nuestra infraestructura blockchain de la que dependen nuestras puertas de enlace. La cadencia del desarrollo de blockchain en estos proyectos puede ser abrumadora, con cambios rotundos y nuevas características novedosas que se presentan con frecuencia y, a veces, con poca advertencia.
Entonces, ¿cómo logra Kraken lanzar docenas de nuevos productos cada año mientras se mantiene al día con el rápido ritmo de desarrollo de blockchain?
¡Pruebas de extremo a extremo (E2E)!
Por qué valoramos las pruebas E2E y evitamos las burlas
Desde los primeros días en Kraken, el énfasis ha sido que las pruebas E2E son el tipo de pruebas más valiosas que un ingeniero puede construir. Las pruebas unitarias tienen su lugar, pero muchos desarrolladores sin experiencia con integraciones complejas tienden a escribir pruebas unitarias para cada fragmento de código que crean con la creencia de que están mejorando la calidad general del software que están desarrollando.
Este camino, aunque está lleno de buenas intenciones, a menudo puede generar mucho dolor en el futuro. La dependencia excesiva de las pruebas unitarias tiende a cimentar su arquitectura; es como verter una capa de epoxi sobre toda la base de su código. Está acoplando estrechamente el código a sus pruebas, haciendo que el código sea más rígido, inflexible y resistente a ser refactorizado. Si necesita hacer un cambio, es probable que deba realizar cambios significativos en las pruebas y, en algunos casos, desecharlas por completo. El código de refactorización es una capacidad clave que un equipo de ingeniería debe tener en su kit de herramientas y cualquier cosa que agregue fricción a la facilidad de la refactorización debe evaluarse cuidadosamente antes de ser introducido. Al refactorizar el código, una prueba E2E bien diseñada a menudo no requiere muchos cambios y proporciona flexibilidad para ajustar las agallas internas de una aplicación al tiempo que garantiza que continúa funcionando como se espera.
¿Significa esto que no deberías escribir pruebas unitarias? ¡Para nada! Hay muchos escenarios en los que las pruebas unitarias son la solución perfecta; sin embargo, hemos descubierto que para integraciones complejas, las pruebas E2E funcionan mejor. En general, las pruebas unitarias son más efectivas cuando se escriben para código que cumple con los siguientes criterios:
- Algorítmicamente complejo con muchos casos extremos.
- Con un alcance estricto con requisitos bien definidos.
- Completa una sola unidad de trabajo.
- Apátrida.
Estas pequeñas piezas de código complejo de alcance estricto suelen ser los bloques de construcción de una aplicación más grande e incluso si se produjera una refactorización, es poco probable que estas funciones cambien. En nuestro mundo, esto sería cosas como derivación de direcciones, validación de direcciones, firma de transacciones, etc.
La conclusión clave aquí es que, como pequeño equipo de ingeniería, no hay forma de que podamos mantener el volumen de servicios que brindamos actualmente. y construir nuevos productos sin pruebas de extremo a extremo. Las pruebas unitarias deben considerarse como un juego de mesa, pero de forma aislada, no serían suficientes para que nos mantengamos al día en este espacio en evolución. En cambio, hemos optado por invertir fuertemente en conjuntos sólidos de integración y pruebas E2E que validan que nuestros servicios funcionarán con éxito en sus modos de operación más comunes.
Desafíos de las pruebas E2E
Aunque las pruebas de E2E pueden ser poderosas, no son una panacea. Cuando se integra con servicios de terceros, este tipo de pruebas a menudo pierden gran parte de su valor, ya que es necesario burlarse de ciertos puntos finales o interfaces para probar completamente el flujo de una función o llamada específica. Los simulacros son tan buenos como su comprensión del servicio del que se está burlando y, como resultado, pueden ser propensos a errores cuando las actualizaciones son frecuentes y de gran tamaño. Mantener su propio código, así como sus simulaciones, es una violación del principio DRY (no lo repita), un término acuñado por David Thomas y Andrew Hunt en "The Pragmatic Programmer". En su libro, afirman que "Todo conocimiento debe tener una representación única, inequívoca y autorizada dentro de un sistema". Crear una versión simulada de cualquier servicio significa que ahora hay dos copias potencialmente divergentes de dicho servicio: su versión simulada y la versión real. Los errores en la traducción del comportamiento de la dependencia simulada son ahora otra preocupación a tener en cuenta.
Regtests al rescate
Afortunadamente para nosotros, la mayoría de las cadenas de bloques admiten la capacidad de ejecutar redes privadas temporales que se pueden activar como parte de nuestro proceso de integración continua (CI) / implementación continua (CD). El ejemplo más popular de esto es el modo de prueba de regresión (regtest) de Bitcoin. Cuando inicia bitcoind con la opción `-regtest`, crea un nuevo entorno de blockchain local sobre el que tiene control total. La característica clave del modo de prueba es que puede extraer una cantidad arbitraria de bloques a voluntad, lo que permite que sus pruebas E2E completen viajes de ida y vuelta para depósitos y retiros de todo tipo y variaciones, simulando cientos de escenarios en segundos. Los casos de borde y otros escenarios únicos se pueden simular fácilmente en el modo de prueba, como transacciones de múltiples firmas, reorganizaciones, reemplazo por tarifa (RBF), hijo paga por padre (CPFP), ¡y más! Estas pruebas no solo garantizan que nuestro código no contenga errores, sino que también validan el estado final de la cadena de bloques y nuestros libros de contabilidad para garantizar que todo funcione como se esperaba.
Como parte del proceso para agregar soporte para una nueva criptomoneda en Kraken, el equipo de financiamiento crea un marco de prueba para todos los nuevos listados. Este código es la base de nuestro régimen de mantenimiento: cada vez que se lanza una nueva versión, es simplemente una cuestión de actualizar la versión del nodo blockchain y volver a ejecutar nuestra canalización de CI para garantizar que no haya cambios importantes. La lectura cuidadosa de las notas de la versión y la colaboración con la comunidad siguen siendo muy necesarias, pero estas pruebas nos dan confianza para lanzar nuevas versiones que de otro modo no tendríamos.
Soluciones Creativas
Desafortunadamente para nosotros, no todas las cadenas de bloques están tan probadas como Bitcoin. Las nuevas cadenas de bloques a menudo introducen conceptos novedosos y, para ofrecer a nuestros clientes acceso a las nuevas tecnologías más emocionantes, Kraken prefiere lanzar el soporte para nuevas cadenas de bloques lo más cerca posible del inicio de la red principal. Para respaldar de manera segura un nuevo activo en o cerca de la fecha de lanzamiento, Kraken a veces necesita desarrollar complejos arneses de prueba para ganar confianza en la integración y asegurarse de que los fondos de los clientes no estén en riesgo.
Una ilustración perfecta de esto es cuando Kraken lanzó el soporte para Ethereum 2.0 solo 3 días después de que la red principal se puso en marcha el 1 de diciembre de 2020. Aunque miles de personas y empresas de todo el mundo ayudaron a probar Ethereum 2.0 en múltiples redes de prueba como Medalla y Spadina, todavía decidió llevar el concepto de pruebas a otro nivel con esta integración. Sabíamos desde el principio que Ethereum 2.0 sería un desarrollo significativo, y esa creencia ha demostrado ser cierta, ya que hasta ahora se han apostado millones de ETH en la cadena de balizas, incluidos más de 800,000 ETH que han sido apostados por los clientes de Kraken.
A continuación, puede ver un diagrama del conjunto de servicios que nuestra canalización de integración continua (CI) activa y desactiva cada vez que un desarrollador confirma código en uno de nuestros repositorios de código ETH2.
En un nivel alto, el flujo de prueba es:
- Inicie los nodos primarios y alternativos de ETH1 (cada uno de ellos se turnará para buscar consenso) con una génesis que contenga una cantidad inicial de ETH para realizar pruebas.
- Inicie el nodo de la cadena de balizas ETH2 como una cadena privada utilizando un modo de configuración mínima especial donde solo se necesitan 16 validadores para activar la génesis.
- Implemente el contrato inteligente ETH2 en la cadena de bloques ETH1.
- Deposite ETH en el contrato de depósito ETH2 donde los fondos se queman y los validadores se crean en el nodo validador externo ETH2. Estos son validadores que solo operan la red ETH2 y se tratan como si fueran externos a los validadores de Kraken.
- Inicie los exploradores de bloques ETH1 y ETH2.
- Inicie la base de datos.
- Inicie Gateway y signatarios.
- Inserte las solicitudes del cliente para apostar ETH -> ETH2.
- Gateway recoge las solicitudes de los clientes y envía ETH al contrato de depósito en la cadena de bloques ETH1 y crea un número correspondiente de validadores en el nodo de validación interno de ETH2. Los validadores se segregan en conjuntos de validadores internos y externos para que podamos probar qué sucede cuando nuestros validadores caen (para probar cortes, penalizaciones, recompensas perdidas) y para ver qué sucede cuando el resto de la red se cae o está fuera de línea, pero nuestros validadores permanecer arriba.
- Supervise hasta que los validadores estén activos en la cadena ETH2, comience a rastrear recompensas, pagos, pruebas de recorte y multas, detección de recompensas perdidas y recompensas de pago a los clientes.
- Ejecute nuestro proceso de reconciliación financiera por separado en todas las transacciones para garantizar que todo en todos nuestros libros de contabilidad coincida correctamente.
Lo anterior es solo un resumen de alto nivel de lo que está sucediendo dentro de nuestro marco de prueba; hay una serie de otras pruebas, comprobaciones y validaciones que se producen. Si un desarrollador necesita depurar algo o ver el estado de cualquiera de las redes, puede consultar a los exploradores de bloques para ver qué ha ocurrido exactamente de un vistazo. Por lo general, no incluimos exploradores de bloques en nuestra canalización de CI, pero dada la complejidad de la integración, fue útil durante la fase de desarrollo visualizar lo que estaba sucediendo en la cadena.
Podría pensar que esto agrega un retraso enorme a nuestra canalización de CI, pero afortunadamente ese no es el caso. Actualmente, la canalización completa de CI para nuestro repositorio Ethereum 2.0 solo tarda 14 minutos en ejecutarse. Esto incluye auditar / construir todas las dependencias, iniciar todos los servicios, implementar varios contratos inteligentes en la cadena de bloques, minar bloques, crear validadores y luego ejecutar los más de 100 escenarios de prueba.
Consideraciones Finales:
El desarrollo de pruebas E2E integrales para cada integración de blockchain en Kraken consume una cantidad significativa de recursos de ingeniería. Es un precio que pagamos con mucho gusto, ya que nuestra principal preocupación es la seguridad de los fondos de nuestros clientes y asegurarnos de que tengan una experiencia de calidad en nuestra plataforma. ¿Podría nuestro equipo lanzar más productos si dedicamos menos tiempo a las pruebas al crear nuevas integraciones? Sin duda. Sin embargo, hacerlo iría en contra del espíritu y los valores no solo del equipo de ingeniería, sino de la empresa en su conjunto. Estas pruebas garantizan que podamos actualizar de forma segura a nuevas versiones del software blockchain, aumentar la confianza durante las bifurcaciones duras / blandas y reducir el estrés del desarrollador al implementar cambios.
¿Por qué los ingenieros de Kraken son algunos de los más respetados de la industria? Este mensaje de Steve Hunt, vicepresidente de ingeniería de Kraken, describe nuestros valores y dedicación para ayudar a otros ingenieros de blockchain.
Fuente: https://blog.kraken.com/post/10227/testing-crypto-payments-staking-at-kraken/
- &
- 000
- 11
- 2020
- de la máquina
- Mi Cuenta
- lector activo
- Todos
- Todas las transacciones
- Permitir
- Aplicación
- arquitectura
- en torno a
- activo
- Activos
- Batalla
- cadena de baliza
- Bitcoin
- blockchain
- BTC
- build
- Construir la
- llamar al
- cases
- Reto
- el cambio
- Cheques
- sus hijos
- código
- colaboración
- viniendo
- Algunos
- vibrante e inclusiva
- Empresas
- compañía
- confianza
- Consenso
- continúa
- contrato
- contratos
- Creamos
- cripto
- criptomonedas
- criptomoneda
- Base de datos
- acuerdo
- retrasar
- Detección
- desarrollar
- Developer
- desarrolladores
- Desarrollo
- Director
- Temprano en la
- Southern Implants
- Eficaz
- ingeniero
- Ingeniería
- certificados
- Entorno
- ERC20
- ETH
- Etereum
- Ethereum 2.0
- Carácter distintivo
- Eventos
- Intercambio
- RÁPIDO
- Feature
- Caracteristicas
- fíat
- financiero
- Flexibilidad
- de tus señales
- Marco conceptual
- ser completados
- función
- universidad
- fondos
- futuras
- General
- Genesis
- candidato
- maravillosa
- esta página
- Alta
- Hogar
- Cómo
- HTTPS
- Cientos
- Incluye
- aumente
- energético
- EN LA MINA
- integración
- integraciones
- solo
- IT
- acuerdo
- Clave
- especialistas
- Kraken
- large
- lanzamiento
- Lead
- Nivel
- Propiedades
- local
- LTC
- Realizar
- Minería
- meses
- Más popular
- Multisig
- del sistema,
- Nuevas características
- nuevos diseños y productos
- nodos
- LANZAMIENTO
- funcionamiento
- Optión
- solicite
- Otro
- Dolor
- Pagar
- pagos
- plataforma
- Popular
- precio
- privada
- Productos
- proyecta
- calidad
- Reading
- reducir
- dependencia
- Requisitos
- Recursos
- RESTO
- Recompensas
- Riesgo
- Ejecutar
- correr
- Safety
- Pantalla
- Servicios
- set
- chica
- inteligente
- contrato inteligente
- Contratos Inteligentes
- So
- Software
- Espacio
- stake
- replanteo
- comienzo
- Estado
- estrés
- SOPORTE
- Soportado
- soportes
- te
- Tecnologías
- temporal
- test
- Pruebas
- pruebas
- equipo
- ficha
- parte superior
- Seguimiento
- transaccional
- Transacciones
- Actualizar
- Actualizaciones
- us
- propuesta de
- volumen
- web
- semana
- dentro de
- Actividades:
- mundo
- X
- xrp
- año