Segunda sesión en https://www.youtube.com/watch?v=TtuVvZeg8E4
En esta sesión usamos mi repositorio:
Ejecutamos comandos del directorio exeth/simple
Levantamos en una terminal el servidor local de Ethereum ganache-cli:
ganache-cli --verbose
Queda escuchando mensajes JSON RPC en http://localhost:8545
.
Ejecutamos:
exeth empty.eth
Este primer script compila el contracto contracts/empty.sol
:
// pragma solidity ^0.4.18;
// Simple empty contract
contract Empty {
}
Este script no solo compila sino que también lo despliega en nuestro nodo local:
# retrieve accounts to use accounts[0] as default sender
accounts
message "compiling empty.sol"
compile "./contracts/empty.sol"
message "empty.sol compiled"
deploy Empty empty1
message "contract deployed to address" result
message "instance empty1 data"
dump instances.empty1
Vimos en la consola de ganache-cli
que esto se traduce
en en envío de una transacción con eth_sendTransaction
. Lo
nuevo, con respecto a las transacciones de la primera sesión,
es que esta transacción NO TIENE campo to
, cuenta destino,
y que tiene un campo adicional data
con valor string hexadecimal.
Ese campo adicional contiene LOS BYTECODES del compilado
del contrato Empty
. Ethereum NO EJECUTA el programa Solidity
SINO el COMPILADO.
También apareció que al enviar esa transacción, el transaction receipt nos informó que se creó una nueva cuenta con dirección, que ALBERGA al resultado de ejecutar el constructor del contrato. El contrato puede asimilarse a una clase en otros lenguajes de programación, y lo que se despliega (una o varias veces) son INSTANCIAS de ese contrato, cada una con una dirección Ethereum asignada al momento de despliegue.
Internamente, el ejecutor de scripts exeth
, escrito en JavaScript,
usa un compilador de Solidity. Este compilador está escrito en
JavaScript, como módulo npm
(node package manager), pero es en realidad
una traducción automática de la versión original del compilador
escrita en lenguaje C.
Usé en la sesión ese compilador nativo, desde la línea de comando:
solc contracts/empty.sol --bin
Eso produjo una salida con el binario:
======= contracts\empty.sol:Empty =======
Binary:
6080604052348015600f57600080fd5b50603580601d6000396000f3
006080604052600080fd00a165627a7a723058202f1c75eb7aea0ee9
d964a7e9f1de904b4c16148a4c7ad3ef482ced7b6d1328fd0029
Los bytecodes de esta máquina virtual Ethereum están especificados en el Yellow Paper:
https://github.com/ethereum/yellowpaper
El 60
(en hexadecimal) del comienzo, es un PUSH1
, pone el próximo byte
80
en una pila interna. Luego le sigue un 60
que pone
un 40
en la pila, y un 52
que es un MSTORE
que almacena
en memoria (en la dirección apuntada por el valor en el tope
de la pila), lo que está en el valor SEGUNDO de la pila.
No es necesario comprender todos el binario, por ahora, y para programar nos basta Solidity. Pero es importante conocer los conceptos porque veremos que la capacidad de ejecutar un contrato, el código de un contrato en una transacción, depende de los bytecodes que enviemos a ejecutar: ejecutarlos tiene un costo en Ethereum, y tenemos que estudiar que distintos bytecodes tienen distinto código.
Luego, para terminar la sesión, ejecutamos:
exeth counter.eth
Lo vamos a ver en detalle en la próxima sesión, pero esto compila
otro contrato, Counter
y ADEMAS de desplegarlo, luego
lo invoca.