Enlace de Golang: ¿llamar al método de contrato y obtener su valor de retorno o tupla?

Supongamos que tengo un contrato como:

pragma solidity ^0.4.11;

contract MyToken {
  uint256 a;

  function SimpleGetter() returns(string) {
    return "something";
  }

  function DoTheGreat(address _to) returns(uint256) payable {
       /// ...
       return /* <...> */;
  }
}

He seguido el artículo un poco desactualizado, pero sigue siendo muy útil y he generado el enlace Go para mi contrato, luego termino con algo como:

// Generate "CEO" keypair(wallet)
key, _ := crypto.GenerateKey()
CEOAuth := bind.NewKeyedTransactor(key)

// Create genesis
alloc := make(core.GenesisAlloc)
alloc[CEOAuth.From] = core.GenesisAccount{Balance: big.NewInt(20000000000000)}

sim := backends.NewSimulatedBackend(core.GenesisAccount{Address: auth.From, Balance: big.NewInt(10000000000)})

// Deploy a token contract on the simulated blockchain
_, _, token, err := DeployMyToken(CEOAuth, sim, ..)
if err != nil {
    log.Fatalf("Failed to deploy new token contract: %v", err)
}

sim.Commit()

val, _ := token.SimpleGetter(nil)
fmt.Println("Something from contrract:", val)

De hecho, estoy usando MyTokenSession:

 the Token contract instance into a session
session := &MyTokenSession{
    Contract: token,
    CallOpts: bind.CallOpts{
        Pending: true,
    },
    TransactOpts: bind.TransactOpts{
        From:     CEOAuth.From,
        Signer:   CEOAuth.Signer,
        GasLimit: big.NewInt(3141592),
    },
}

El problema es que echamos un vistazo a Go bidining from abigenpara nuestra función DoTheGreat(), se ve así:

func (_MyToken *MyTokenSession) DoTheGreat(_to common.Address) (*types.Transaction, error) {
    // ....
}

Como puede ver, regresa *types.Transactiony no veo una forma de entender si tengo que firmarlo, enviarlo y cómo obtener los valores de retorno de mi función de contrato.

El valor de tx.Value()es *big.Int, pero no está relacionado con los datos devueltos por contrato, siempre es cero. ¿Alguien podría introducir algún código para mi caso?

Hay una pregunta similar con respecto a web3js ethereum.stackexchange.com/questions/15704/…

Respuestas (1)

type.Transactiones un tipo de transacción. Cuando llama a un contrato utilizando el código generado a través de abigen, la firma y la transmisión se manejan por usted, utilizando los detalles clave especificados en su sesión. La transacción devuelta contendrá la información de la transacción que se transmitió.

Antes de que pueda observar cualquier efecto de la transacción, debe esperar a que se extraiga y verificar el recibo de tx. Hasta donde yo sé, los valores devueltos actualmente no se devuelven en el recibo de tx, y los EIP para permitir eso todavía están bajo consideración. Si desea extraer datos de una transacción de escritura, use eventos. Si su función no altera el estado del contrato, márquelo como vista o función pura. abigenproducirá métodos de solo lectura para ver y funciones puras que devuelven los datos apropiados en lugar de types.Transaction.

El campo de valor que ve es el valor transferido desde la Fromcuenta en esa transacción, que es 0 para la mayoría de las llamadas de contrato.

Gracias por la aclaración definitiva. Entonces, la mejor opción es usar el evento GreatEventemitido por esa función y suscribirse al evento usando GreatEventWatch()la función del enlace.