Ondas de contratos inteligentes. Primera experiencia

imagen

En abril de 2018, el equipo de Waves presentó sus contratos inteligentes no completos.

Un poco más tarde, cuando se anunció el hackathon de Waves, decidí que era hora de sumergirse en la nueva tecnología. Debajo del corte, encontrará información detallada sobre el contrato inteligente que ganó el tercer lugar en el hackathon.

El artículo será útil para que los desarrolladores implementen sus propios contratos inteligentes y se familiaricen con la tecnología.

Idea


La idea del proyecto es distribuir automáticamente los salarios de los desarrolladores de software que usan Github, en proporción al trabajo realizado. La tarea principal, la tarea que el contrato inteligente resuelve al mismo tiempo, elimina la necesidad de confiar en el programa de distribución de dinero e incluso permite al usuario sin habilidades de programación verificar la distribución correcta de los fondos antes de transferir dinero.

Pila de tecnología


Html y JavaScript ( biblioteca Node.js Waves), código abierto en GitHub y demostración del proyecto en Firebase Hosting

El proceso


  1. El usuario selecciona el repositorio de GitHub y determina la cantidad total de salarios.
  2. El usuario realiza un pago de 0.01 Waves (aproximadamente 0.02 dólares) para guardar datos en la cadena de bloques y crear un contrato inteligente
  3. El usuario verifica la exactitud de los datos y luego transfiere el monto de los salarios a la dirección del contrato inteligente
  4. Los salarios se comparten entre los desarrolladores.

Desarrollo


El mejor punto de entrada para un desarrollador novato es la consola de demostración , que contiene un buen ejemplo y una consola para probar el código. Durante el desarrollo, es mejor usar una blockchain de prueba , donde puede obtener 10 ondas de prueba gratuitas con un solo clic . Aunque Google todavía no encuentra muchos ejemplos debido a la novedad de la tecnología, los contratos inteligentes están bien documentados y contienen toda la información necesaria.

La biblioteca NodeJs (1.4.0) ya funciona bien en los navegadores (con la excepción de crear Alias), pero, desafortunadamente, NO es compatible con Google Functions o React Native todavía (los desarrolladores de Waves prometen solucionarlo pronto).

Contrato inteligente


Se crea un contrato inteligente para una cuenta y verifica cada acción con esta cuenta (con la excepción de las transferencias de dinero entrantes):

let signature = base58'${currentWallet.keyPair.publicKey}'; match tx { case tx:TransferTransaction => { let employerAddress = addressFromPublicKey(tx.senderPk); let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes); let salary = extract(getLong(employerAddress, dateKey)); if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false } case _ => false } 

Análisis inteligente de contrato línea por línea


 let signature = base58'${currentWallet.keyPair.publicKey}'; 

Aquí guardamos la clave pública de la billetera (su JavaScript debe contener la variable currentWallet creada usando el comando Waves.Seed.create ()), de modo que solo la cuenta de contrato inteligente de la billetera (Smart Rewarding Project en nuestro caso) pueda transferir fondos.

 match tx { case tx:TransferTransaction => {some validations} case _ => false } 

Esta es la construcción básica de cualquier contrato inteligente de Waves. Nos dice que este contrato prohíbe cualquier actividad que no sea la transferencia de fondos (TransferTransaction). Por lo tanto, después de crear un contrato, es imposible cambiar los datos de los desarrolladores (DataTransaction) o cambiar el contrato inteligente en sí (SetScript).

 let employerAddress = addressFromPublicKey(tx.senderPk); 

Utiliza el método base addressFromPublicKey de la biblioteca integrada para obtener la dirección del creador de la solicitud de su clave pública.

 let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes); 

El método base addressFromRecipient obtiene la dirección del destinatario de los fondos.

 let salary = extract(getLong(employerAddress, dateKey)); 

El método básico getLong nos proporciona datos almacenados en la cadena de bloques en la dirección del creador de la solicitud, que es el monto del salario del desarrollador. El contrato puede acceder a los datos almacenados en la cadena de bloques de Waves (y NO puede acceder a los datos ubicados en ningún sitio web o servidor de terceros).

 if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false 

Aquí es donde se verifica la cantidad correcta y la firma. Verdadero significa que se permitirá la transacción, y falso significa que la transacción será denegada. Por lo tanto, durante cualquier transferencia de dinero desde esta cuenta, se verifica que el dinero se enviará solo a la billetera del desarrollador y en la cantidad ya almacenada en la cadena de bloques, en el formato de un par de claves fácilmente legible (dirección como clave y cantidad como valor), lo que permite confíe en el programa, verifique todos los datos usted mismo durante 5-10 segundos antes de transferir los salarios.

Demostración en línea del proyecto en la cadena de bloques de prueba, disponible aquí
Aquí puedes ver el código del proyecto.

Espero que el artículo sea informativo y le sea útil para escribir su primer contrato inteligente.

Source: https://habr.com/ru/post/es424111/


All Articles