WEB3DEV Español

Cover image for Cómo implementar un contrato usando XVM
Juliana Cabeza
Juliana Cabeza

Posted on

Cómo implementar un contrato usando XVM

Image description

Motivación

Todos los desarrolladores que han estado implementando contratos en Astar Network durante mucho tiempo, deberían haber implementado contratos, en primer lugar, en EVM. Eso es porque Astar Network, fue la primera en darle soporte a EVM.

Todos los desarrolladores de contratos que apoyan a Astar Network, incluyéndome, quisieran implementar contratos conink!

Entonces, ¿tirarás por la borda el contrato EVM que implementaste en el pasado? ¿O detienes el desarrollo y no haces nada? ¿O desea convertir todos los contratos implementados en Solidity a Rust?

Ninguna de las opciones son buenas, ¿verdad? No es necesario decir que Astar Network tiene diferentes opciones. “XVM”.

Con XVM, puedes negociar contratos en EVM, desde el ink! Esta vez, presentaré cómo implementar el contrato de ink! utilizando XVM.

Definitivamente, quiero implementar algo usando XVM en mi próximo hackathon.

ink-xvm-sdk

Primero, hablemos del "ink-xvm-sdk" creado por el equipo central de Astar Network.

Como dijo Shunsuke-san, del equipo central y, estoy de acuerdo, esto no es un SDK. Estaría más cerca de una implementación de muestra que de un SDK.

Echemos un vistazo al "erc20", una implementación que opera contratos ERC20 en EVM.

Vamos a ver.

Esta vez, explicaré usando el método de "transfer" como muestra.

Lo primero que quiero que noten es el "contratista".

 #[ink(constructor)]

        pub fn new(evm_address: [u8; 20]) -> Self {

            Self { evm_address }

        }
Enter fullscreen mode Exit fullscreen mode

Aquí, el parámetro es la dirección del contrato “erc20” implementado en el EVM. La dirección de contrato de EVM es obligatoria cuando se trata de cualquier contrato.

#[ink(message)]

        pub fn transfer(&mut self, to: [u8; 20], value: u128) -> bool {

            let encoded_input = Self::transfer_encode(to.into(), value.into());

            self.env()

                .extension()

                .xvm_call(

                    super::EVM_ID,

                    Vec::from(self.evm_address.as_ref()),

                    encoded_input,

                )

                .is_ok()

        }
Enter fullscreen mode Exit fullscreen mode

La siguiente función de transferencia consta de dos partes. La primera, es la parte que codifica los datos necesarios para llamar usando Xvm. Y la otra, es la parte que llama al propio Xvm.

No he verificado los detalles de la parte que llama a Xvm pero, puedo ver que se puede llamar con código fijo.

Y la parte de la codificación es manejada por una función llamada "transfer_encode" ,y parece que se implementa para cada función que es llamada. Ahora, echemos un vistazo a esta función "transfer_encode".

fn transfer_encode(to: H160, value: U256) -> Vec<u8> {

            let mut encoded = TRANSFER_SELECTOR.to_vec();

            let input = [Token::Address(to), Token::Uint(value)];

            encoded.extend(&ethabi::encode(&input));

            encoded

        }
Enter fullscreen mode Exit fullscreen mode

La implementación es relativamente simple.

Convierte la constante “TRANSFER_SELECTOR” a vec.
Almacena los argumentos "to(a)" y "value(valor)" de la función "transfer(transferir)" en una matriz.
Codifiqua esto usando ethabi y, agrégalo al primer vec que creaste.

Hay una cosa que no entiendo aquí, y es una constante llamada " TRANSFER_SELECTOR ". Esta definición se ve así:

const TRANSFER_SELECTOR: [u8; 4] = hex! ["a9059cbb"];
Enter fullscreen mode Exit fullscreen mode

Este es un selector que da como resultado de la construcción de Solidity.

Image description

Almacenado en metadata.json como arriba.

Pasos para implementar un contrato de ink! utilizando el "XVM"

  1. Implementa un constructor con la dirección del contrato en el EVM como argumento.
  2. Obtén el selector de la función de destino desde el metadata.json, creado al compilar Solidity y configúralo en una constante.
  3. Implementa una función que cree datos codificados para llamar a la función.
  4. Implementa la función a llamar, crea los datos con la función de codificación e implemente el proceso de llamada xvm.

Esta vez, utilicé los pasos anteriores para implementar un contrato xvm que llama al contrato store, que es un contrato de ejemplo para Remix.

#![cfg_attr(not(feature = "std"), no_std)]



/// ID EVM  (do runtime astar)

const EVM_ID: u8 = 0x0F;



#[ink::contract(env = xvm_environment::XvmDefaultEnvironment)]

mod store_xvm {

    use ethabi::{

        ethereum_types::{

            H160,

            U256,

        },

        Token,

    };

    use hex_literal::hex;

    use ink::prelude::vec::Vec;



    const STORE_SELECTOR: [u8; 4] = hex!["6057361d"];



    #[ink(storage)]

    pub struct StoreXvm {

        evm_address: [u8; 20],

    }



    impl StoreXvm {

        #[ink(constructor)]

        pub fn new(evm_address: [u8; 20]) -> Self {

            Self { evm_address }

        }



        #[ink(message)]

        pub fn store(&mut self, value: u128) -> bool {

            let encoded_input = Self::store_encode( value.into());

            self.env()

                .extension()

                .xvm_call(

                    super::EVM_ID,

                    Vec::from(self.evm_address.as_ref()),

                    encoded_input,

                )

                .is_ok()

        }



        fn store_encode(value: U256) -> Vec<u8> {

            let mut encoded = STORE_SELECTOR.to_vec();

            let input = [Token::Uint(value)];

            encoded.extend(&ethabi::encode(&input));


            encoded

        }



    }



}
Enter fullscreen mode Exit fullscreen mode

El código fuente completo está disponible en este repositorio:

Prueba

Inicia el nodo local de Astar.

% ./astar-collator_4_46 --version             

astar-collator_4_46 4.46.1-acaecc594c7



% ./astar-collator_4_46 --dev --tmp

2023-04-21 19:44:13 Astar Collator    

2023-04-21 19:44:13 ✌️  version 4.46.1-acaecc594c7    

2023-04-21 19:44:13 ❤️  by Stake Technologies <[email protected]>, 2019-2023

Enter fullscreen mode Exit fullscreen mode

Accede a Remix y compila el contrato "store" para asegurarte que el valor no se almacene.

Image description

Luego, usa Polkadot/Substrate Portal para implementar el contrato de ink!

Image description

A continuación, llama a la función "store" de Polkadot/Substrate Portal.

Image description

Si compruebas que el valor está almacenado en el lado de Remix, puedes confirmar que el valor establecido, cuando lo llamaste, está almacenado.

Próximo Paso

Recientemente, tuve la oportunidad de conversar con Kim Hoon, CTO de Astar Foundation. Al hablar con él, me di cuenta, nuevamente, del gran valor de Astar Network. Me percaté que, al usar XCM, podía integrar la funcionalidad de otras cadenas en mis propios contratos. La funcionalidad EVM también se puede integrar utilizando XVM. Y al usar dapp Staking, puedes crear una aplicación altamente sostenible al obtener fondos operativos de la dapp. Creemos que, usando Astar Network, podemos crear nuevas aplicaciones que no han sido implementadas en el mundo existente de Web2.

Me gustaría seguir aprendiendo la tecnología de Astar Network y transmitirla a la mayor cantidad de personas posible.

Sobre Astar Network

El futuro de los contratos inteligentes multichain.

Astar es la plataforma de contrato inteligente más popular de Japón, que admite entornos EVM y WebAssembly (Wasm) y la interoperabilidad entre ellos, mediante una máquina virtual cruzada. Astar Network es amigable para todo tipo de desarrolladores y, las herramientas y lenguajes que ya conocen. Con el respaldo de la seguridad compartida de Polkadot, Astar brilla por derecho propio en un ecosistema vibrante y saludable, y en la industria de blockchain en general, impulsando la adopción corporativa internacional y el interés de los consumidores en las tecnologías Web3.

El sistema Build2Earn de Astar está diseñado para hacer crecer la red de una manera innovadora, recompensando simultáneamente a los participantes y constructores. Permite a los desarrolladores obtener incentivos para crear y mantener sus aplicaciones descentralizadas y a los usuarios, obtener incentivos para respaldar sus proyectos favoritos, fomentando el crecimiento general del ecosistema.

Este artículo fue escrito por Realtakahashi Work y traducido por Juliana Cabeza. El original en inglés se puede encontrar aquí.

Discussion (0)