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),
},
}
abigen
Das 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.Transaction
und 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?
type.Transaction
ist 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. abigen
erzeugt 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 From
Konto in dieser Transaktion übertragene Wert, der für die meisten Vertragsaufrufe 0 ist.
GreatEvent
und das Ereignis mit GreatEventWatch()
der Funktion aus der Bindung zu abonnieren.
Rollen