Soy un novato en este campo, así que pido disculpas de antemano si esto parece trivial.
Digamos que he escrito algo de código Solidity
, por ejemplo, algo así como el código de clasificación rápida ( https://gist.github.com/subhodi/b3b86cc13ad2636420963e692a4d896f ).
Ahora quiero ejecutarlo localmente con mi evm
máquina virtual (por alguna razón, preferimos ejecutarlo localmente con la máquina virtual, en lugar de usar algunos servicios web...), entonces usaría comandos como:
solc --bin --optimize -o . qs.sol
./evm --debug --code $(cat QuickSort.bin) run
Entonces, después de ejecutar los comandos anteriores, veo algunos registros impresos; sin embargo, todavía no tengo claro:
¿Cómo puedo especificar exactamente una función para ejecutar? En el caso de clasificación rápida anterior, solo tengo una función "pública", pero ¿y si tengo muchas?
¿ Cómo pasar parámetros al evm
cuando se ejecutan ciertas funciones?
¿Hay alguna forma conveniente en la que pueda esperar leer algún resultado? Por ejemplo, ¿puede evm
devolver una matriz ordenada e imprimirla de alguna manera, o escribir en algunos archivos de registro?
Algunos conceptos básicos de la teoría te confunden.
Todo "se ejecuta" en el EVM, que es una máquina de estado distribuida. Puede configurar una cadena de bloques privada local o ganache-cli o incluso Remix para "ejecutar" localmente en un contexto aislado .
Su constant
función sort()
es de solo lectura y, por lo tanto, siempre se ejecutará localmente en todos los contextos. constant
es obsoleto. Podrías usar pure
.
Para usar la función, firmaría y llamaría sort(arguments[])
usando Web3. Debería devolver una matriz ordenada si todo sale según lo planeado.
Advierto que este no es un proyecto ideal para familiarizarse con Ethereum y también posiblemente una idea horrible para un sistema de producción debido al costo del gas y las limitaciones inherentes de realizar este tipo de proceso en cadena. La ordenación debe evitarse en la medida de lo posible. Por lo general, es posible. https://blog.b9lab.com/the-joy-of-minimalism-in-smart-contract-design-2303010c8b09
Espero eso ayude.
Con respecto a sus dos primeros puntos: los parámetros se pasan a través de los llamados "Datos de llamada". Los datos de las llamadas se recuperan a través de ciertos códigos de operación EVM (CALLDATACOPY, CALLDATASIZE, CALLDATALOAD). En su entorno de prueba, al usar la evm
herramienta, puede proporcionar datos de llamadas con el parámetro --input, por ejemplo: --input 11223344
proporcionará 4 bytes de datos, 0x11223344.
La ABI pública de los contratos de Ethereum especifica que los primeros 4 bytes de los datos de la llamada son su selector de función pública (calculados como los 4 bytes superiores del hash Keccak256 de un prototipo normalizado de función pública). Ese hash lo proporciona solc
cuando compila su fuente.
Eso debería responder a los puntos 1 y 2. Encontrará más información sobre ABI pública aquí: https://solidity.readthedocs.io/en/latest/abi-spec.html
Rob Hitchens