La comunidad de Tezos crece con bastante rapidez y, a menudo, la documentación que se puede encontrar ya no refleja el estado real de las cosas. Mi tarea consistía en implementar un contrato inteligente en la red principal de Tezos, y esta no era una tarea trivial.
Primero, una breve introducción. La versión actual del código se puede encontrar en este enlace, y la documentación está aquí. En esta parte, analizaremos la instalación de la versión actual de Tezos y la generación de cuentas.
Trabajaremos en Mainnet, pero instalaremos Babylon, ya que será necesario generar la clave privada sin cifrar, y esto solo es posible en una red de prueba:
sudo apt install -y rsync git m4 build-essential parche descomprimir bubblewrap wget pkg-config libgmp-dev libev-dev libhidapi-dev que
wget https://github.com/ocaml/opam/releases/download/2.0.3/opam-2.0.3-x86_64-linux
sudo cp opam-2.0.3-x86_64-linux / usr / local / bin / opam
sudo chmod a + x / usr / local / bin / opam
git clone https://gitlab.com/tezos/tezos.git
cd tezos
git checkout babylonnet
opam init –bare
hacer construcciones
eval $ (opam env)
hacer
Más detalles aquí. Para construir Tezos con preajustes de Mainnet, debe reemplazar git checkout babylonnet por git checkout mainnet
Necesitamos los ejecutables tezos-node y tezos-client. En una ventana de terminal, ejecute:
./tezos-node run –rpc-addr localhost
En otro:
./tezos-client gen keys my_tezos_address
cat ~ / .tezos-client / secret_keys
Y deberías ver algo similar a:
({"Nombre": "my_tezos_address",
"valor":
"Sin cifrar: SECRET_KEY"})
Bajo ninguna circunstancia, no lo extienda a ningún lado y no muestre SECRET_KEY a nadie.
Quizás haya una forma más fácil de generar la clave en forma no cifrada o una forma de descifrar la existente. Deja tus comentarios a continuación.
En la sección anterior, aprendimos cómo construir y ejecutar un nodo Tezos y generar una dirección. Ahora compilemos el contrato inteligente y lo implementemos en la red principal de Tezos.
El primer problema: el contrato inteligente se escribió en Liquidity y había un editor en línea conveniente que dejó de funcionar con la red Tezos, pero todavía hay un compilador que puede traducir el código fuente a Michelson. El último es el idioma oficial de Tezos, pero de muy bajo nivel. Idiomas recomendados para escribir contratos para Tezos:
Ligo – lenguaje similar a Pascal SmartPy – lenguaje similar a Python Morley – una biblioteca para Haskell
En general, le aconsejo que lea el Portal de Desarrolladores de Tezos si está interesado en desarrollar para Tezos. Desafortunadamente, no hay una palabra sobre la red principal, aunque hay diferencias.
Para no reescribir el contrato, sino aprovechar lo que es, instalamos el compilador Liquidity:
el interruptor opam crea liquidez 4.06.1
git clone https://github.com/OCamlPro/liquidity
liquidez de cd
eval `opam env – cambiar liquidez`
hacer clone-dune-network
hacer construcciones
hacer
Para más detalles, consulte la documentación oficial. Durante el ensamblaje, todo se detuvo varias veces porque faltaban dependencias. Vea el mensaje de error e instale manualmente las bibliotecas necesarias.
Finalmente, compilar es lo más simple posible:
./liquidity contract.liq
El resultado es un archivo contract.tz que necesitamos. La liquidez produce un código ligeramente optimizado. Si escribe, por ejemplo, en Ligo, puede obtener menos operaciones y, en consecuencia, la implementación será más barata.
Otro problema fue la inconsistencia de la documentación con la realidad. Si está buscando cómo implementar un contrato en la red de Tezos, seguramente encontrará las siguientes instrucciones:
tezos-client origina my_contract transfiriendo 0 desde my_account ejecutando my_contract.tz
pero no funcionó para mí, recibí un error de comando no reconocido. Mirando la documentación del cliente tezos, no encontré el comando originar. No hay herramientas convenientes con una interfaz gráfica, por lo que nuestra única opción es la interfaz de línea de comandos.
Afortunadamente, encontré una gran herramienta para trabajar con Tezos: los pytezos. Tenga en cuenta que este es un tenedor, viene con un script pytezos. Instalación:
virtualenv -p python3 venv
fuente venv / bin / activar
pip install git + https: //github.com/baking-bad/pytezos
pytezos
Si después de ejecutar el último comando vio mensajes de ayuda, todo salió bien.
Antes de implementar el contrato, debe revelar una cuenta en el nodo. pytezos usa el sitio público https://rpc.tzkt.io/mainnet/. Hacemos lo siguiente:
pytezos activan –net mainnet SECRET_KEY
donde SECRET_KEY es su clave privada generada anteriormente. Ahora pase a implementar el contrato:
despliegue de pytezos –net mainnet –key SECRET_KEY contract.tz –dry-run
donde contract.tz es el contrato inteligente compilado; –dry-run: esta opción le permite verificar la exactitud de todos los datos. Si todo salió bien, elimine –dry-run y vuelva a ejecutar.
En general, puede trabajar con un contrato de la siguiente manera. Abre la consola de Python:
de pytezos import pytezos
mnet = pytezos.using (key = SECRET_KEY, shell = "mainnet")
ci = mnet.contract (CONTRACT_ADDRESS)
ci
CONTRACT_ADDRESS: la dirección del contrato, que se puede obtener después de que se ejecuta el despliegue de pytezos o mira, por ejemplo, las transacciones de Tezos.ID en su cuenta.
La última línea mostrará los métodos disponibles para el contrato, así como la dirección de su cuenta, nodo público y contrato.
Para llamar a un método, ejecute:
ci.CONTRACT_FUNCTION (). operation_group.sign (). inject ()
CONTRACT_FUNCTION: el nombre del método que vamos a llamar; entre paréntesis pasamos los argumentos de acuerdo con la descripción del método; .operation_group.sign (). inject (): firma la transacción y la envía a la red. Después de la ejecución, verá información de la transacción que se ve así:
{
'chain_id': 'NetXdQprcVkpaWU',
'hash': 'HASH',
'protocol': 'PsBabyM1eUXZseaJdmXFApDSBqj8YBfwELoxZHHW77EMcAbbwAS',
'branch': 'BLEprQFdYU5KkqbLs8jhNZtAogLnP6Jc8iJVhzTbsUaTB7M8hoe',
'contenido':(
{
'kind': 'transacción',
'source': 'PUBLIC_ADDRESS',
'fee': '40298',
'counter': '2333835',
'gas_limit': '400000',
'storage_limit': '60000',
'cantidad': '0',
'destination': 'CONTRACT_ADDRESS',
'parámetros': {
'entrypoint': 'CONTRACT_FUNCTION',
'valor':{
'prim': 'Par',
'args' 🙁
…
)
}
}
}
),
'firma': 'sigetA79oZqn2Rworst4Cpn59wEHc1aTvrRCh7iH4hQhTjAuA6t9RshZie8BEXjp2GJCocPFqV3d3iZrhe5Zw8bfNTbPK2Xz'
}
Puede usar HASH para buscar una transacción en y verificar su estado:
op = mnet.shell.blocks (-20 :). find_operation (HASH)
op ('contenido') (0) ('metadatos') ('operation_result') ('estado')
Si recibe una excepción después de la primera línea, la transacción aún no se ha incluido en la cadena de bloques y debe esperar.