Golang-Bindung - Vertragsmethode aufrufen und Rückgabewert oder Tupel abrufen?

Angenommen, ich habe einen Vertrag wie:

pragma solidity ^0.4.11;

contract MyToken {
  uint256 a;

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

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

Ich habe den etwas veralteten, aber immer noch sehr nützlichen Artikel verfolgt und Go Binding für meinen Vertrag generiert, dann lande ich einfach bei so etwas wie:

// 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)

Ich verwende tatsächlich 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),
    },
}

abigenDas Problem ist, dass wir uns Go bidining from für unsere Funktion ansehen DoTheGreat(), es sieht so aus:

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

Wie Sie sehen können, kehrt es zurück *types.Transactionund ich sehe keine Möglichkeit zu verstehen, ob ich es signieren, senden und wie ich die Rückgabewerte von meiner Vertragsfunktion erhalten muss.

Der Wert für tx.Value()ist *big.Int, bezieht sich aber nicht auf vertraglich zurückgegebene Daten, er ist immer Null. Könnte jemand einen Code für meinen Fall einwerfen?

Es gibt eine ähnliche Frage zu web3js ethereum.stackexchange.com/questions/15704/…

Antworten (1)

type.Transactionist ein Transaktionstyp. Wenn Sie einen Vertrag mit dem über abigen generierten Code aufrufen, wird das Signieren und Senden mit den in Ihrer Sitzung angegebenen Schlüsseldetails für Sie abgewickelt. Die zurückgegebene Transaktion enthält die Informationen der gesendeten Transaktion.

Bevor Sie die Auswirkungen der Transaktion beobachten können, müssen Sie warten, bis sie abgebaut ist, und dann die TX-Quittung überprüfen. Soweit mir bekannt ist, werden Rückgabewerte derzeit nicht in der tx-Quittung zurückgegeben, und EIPs, um dies zuzulassen, werden noch geprüft. Wenn Sie Daten aus einer Schreibtransaktion extrahieren möchten, verwenden Sie Ereignisse. Wenn Ihre Funktion den Vertragszustand nicht ändert, kennzeichnen Sie sie als Ansicht oder reine Funktion. abigenerzeugt Nur-Lese-Methoden für Ansichts- und reine Funktionen, die die entsprechenden Daten anstelle von zurückgeben types.Transaction.

Das Wertfeld, das Sie sehen, ist der vom FromKonto in dieser Transaktion übertragene Wert, der für die meisten Vertragsaufrufe 0 ist.

Danke für definitive Aufklärung. Die beste Wahl ist also, das von dieser Funktion ausgegebene Ereignis zu verwenden GreatEventund das Ereignis mit GreatEventWatch()der Funktion aus der Bindung zu abonnieren.