¿Cómo permitir que evm ejecute una función desde un contrato inteligente y reciba resultados de manera práctica?

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 evmmá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:

  1. ¿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?

  2. ¿ Cómo pasar parámetros al evmcuando se ejecutan ciertas funciones?

  3. ¿Hay alguna forma conveniente en la que pueda esperar leer algún resultado? Por ejemplo, ¿puede evmdevolver una matriz ordenada e imprimirla de alguna manera, o escribir en algunos archivos de registro?

Respuestas (2)

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 constantfunción sort()es de solo lectura y, por lo tanto, siempre se ejecutará localmente en todos los contextos. constantes 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.

Una red privada es un entorno de prueba válido, pero es algo complicado cuando recién comienza. Se inicializa con su propio bloque de génesis, deshabilita el descubrimiento de pares (para que no busque), se asegura de que algo esté minando (o de lo contrario, nunca sucederá nada), luego el proceso habitual de implementación de contratos e interacción.

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 evmherramienta, puede proporcionar datos de llamadas con el parámetro --input, por ejemplo: --input 11223344proporcionará 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 solccuando 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