¿Es posible obtener el código de bytes del evm en golang?

Imagine este escenario, tengo un contrato que tiene una función a la que llamo con runtime.Call().

Pero esta función devuelve una dirección de un contrato recién creado, pero no el código de bytes como lo hace runtime.Create.

¿Cómo accedería a ese código de bytes?

¡¡Gracias!!

eth_getcode se puede invocar a través de RPC o IPC.
Sí, pero estoy trabajando directamente en el evm creando un archivo de génesis. Así que necesito incluir todos esos datos en un génesis. Así que no tengo acceso desde fuera de la cadena de bloques, porque ni siquiera es una instancia. Pero esto me da una buena idea, puedo revisar cómo se implementa ese eth_getcode en el nivel bajo. ¡Gracias!
Puede usar geth para iniciar una cadena con su génesis y luego geth dump 0volcar el trie de estado del bloque de génesis, que contendrá el código y los saldos de cada cuenta.
que bytecode??? el bytecode del contrato? es parte de la transacción, un campo llamado extra data, también llamado inputcuando se ejecuta evm.Call().

Respuestas (1)

¡Sí, lo es! Utilice el CodeAtmétodo de cliente del ethclientpaquete para leer el código de bytes de un contrato inteligente implementado. Aquí hay un ejemplo completo:

package main

import (
    "context"
    "encoding/hex"
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial("https://rinkeby.infura.io")
    if err != nil {
        log.Fatal(err)
    }

    contractAddress := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")
    bytecode, err := client.CodeAt(context.Background(), contractAddress, nil) // nil is latest block
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(hex.EncodeToString(bytecode)) // 60806...10029
}

Será el mismo resultado que se ve en etherscan