Gibt es eine Möglichkeit, die Go-Ethereum-Bibliothek zu verwenden, um die Zeichenfolge zu erhalten, die ich an JSON RPC senden muss, um eine Vertragsmethode aufzurufen. Ich meine, Go-Ethereum wird mit einer CLI geliefert, also muss es einige eingebaute Funktionen geben, die dies bereits tun.
Ich schreibe gerade einen Wrapper in GO für den JSON-RPC und hätte gerne eine einfache Möglichkeit, die Methodensignatur und Parameter zu codieren, um sie für den RPC-Aufruf des Vertrags vorzubereiten.
Vielen Dank im Voraus
BEARBEITEN: Ich habe gerade gesehen, dass Version 1.4.1 die Funktionalität der Bindung an Contract ABI und die Interaktion mit dem Vertrag über Go ( https://github.com/ethereum/go-ethereum/releases ) hinzugefügt hat. Ich werde diese Frage als beantwortet markieren
Hier ist ein vollständiges Beispiel dafür, wie Sie einen Smart Contract mit abigen
go-ethereum zu einem Go-Paket kompilieren und dann eine Transaktion an eine Methode senden, bei der die zugrunde liegende Bindung die Codierung und Übertragung für Sie übernimmt.
Store.sol
pragma solidity ^0.4.24;
contract Store {
event ItemSet(bytes32 key, bytes32 value);
string public version;
mapping (bytes32 => bytes32) public items;
constructor(string _version) public {
version = _version;
}
function setItem(bytes32 key, bytes32 value) external {
items[key] = value;
emit ItemSet(key, value);
}
}
Zusammenstellung
solc --abi Store.sol | awk '/JSON ABI/{x=1;next}x' > Store.abi
solc --bin Store.sol | awk '/Binary:/{x=1;next}x' > Store.bin
abigen --bin=Store.bin --abi=Store.abi --pkg=store --out=Store.go
main.go
package main
import (
"fmt"
"log"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
store "./contracts" // for demo
)
func main() {
client, err := ethclient.Dial("https://rinkeby.infura.io")
if err != nil {
log.Fatal(err)
}
privateKey, err := crypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")
if err != nil {
log.Fatal(err)
}
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Fatal("error casting public key to ECDSA")
}
fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
log.Fatal(err)
}
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
log.Fatal(err)
}
auth := bind.NewKeyedTransactor(privateKey)
auth.Nonce = big.NewInt(int64(nonce))
auth.Value = big.NewInt(0) // in wei
auth.GasLimit = uint64(300000) // in units
auth.GasPrice = gasPrice
address := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")
instance, err := store.NewStore(address, client)
if err != nil {
log.Fatal(err)
}
key := [32]byte{}
value := [32]byte{}
copy(key[:], []byte("foo"))
copy(value[:], []byte("bar"))
tx, err := instance.SetItem(auth, key, value)
if err != nil {
log.Fatal(err)
}
fmt.Printf("tx sent: %s", tx.Hash().Hex()) // tx sent: 0x8d490e535678e9a24360e955d75b27ad307bdfb97a1dca51d0f3035dcee3e870
result, err := instance.Items(nil, key)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(result[:])) // "bar"
}
Weitere Beispiele finden Sie im Handbuch Ethereum Development with Go .