Wie greife ich auf das Ereignisprotokoll zu, wenn ich die Vertragsadresse (golang) kenne?

Im Moment entwickle ich Dapps, die Smart Contracts als Speicher für bestimmte Daten verwenden. Ich verwende abigen, um eine spezifische Go-Bindung für meinen Vertrag zu generieren. Wenn jemand versucht, den Vertragsstatus zu ändern, verwende ich das Ereignis, um diese Aktion zu protokollieren. Aber ich stecke fest, weil ich nicht wirklich verstehe, wie ich den Protokollverlauf eines bestimmten Ereignisses mit Go Ethereum anzeigen kann.

Wie kann ich json rpc call of eth_getlogsmethod verwenden und alle Protokolle abrufen, die in dieser Vertragsadresse mit go gespeichert sind?

Ich werde für ein Code-Snippet geschätzt.

Danke im Voraus!

Antworten (2)

Normalerweise würden Sie zuerst einen neuen Filter ( eth_newFilter+ eth_getFilterLogs) erstellen und diesen Filter wiederverwenden, um dieselbe Abfrage viele Male auszuführen und auf Änderungen zu warten. Sie können jedoch auch einen Ad-hoc-Filter mit installieren eth_getLogs, der auf die Themen verweist, die Sie durchsuchen möchten.

Ein Thema ist ein Datenelement, nach dem Sie suchen. Zum Beispiel, wenn Sie das folgende Ereignis haben:

Transfer(address to, address from)

Der folgende Filter würde nach allen Protokollen suchen, die an gehen 0xb3904758c0d3bfc25746c47caa45b01da8930e19:

[0x000000000000000000000000b3904758c0d3bfc25746c47caa45b01da8930e19, null]

Dieser Filter würde nach allen Protokollen suchen, die aus folgenden Quellen stammen 0xb3904758c0d3bfc25746c47caa45b01da8930e19:

[null, 0x000000000000000000000000b3904758c0d3bfc25746c47caa45b01da8930e19]

Und dieser Filter würde nach allen Protokollen suchen, die 0xb3904758c0d3bfc25746c47caa45b01da8930e19von gehen 0x8cc19c7b50857abbfbeeed31c302319a075d4a9b:

[0x000000000000000000000000b3904758c0d3bfc25746c47caa45b01da8930e19, 0x0000000000000000000000008cc19c7b50857abbfbeeed31c302319a075d4a9b

Ein vollständiger Golang-Wrapper für RPC-Anforderungen würde etwa so aussehen:

// This needs to be instantiated
type EthereumClient struct {
  URL string
}

// Basic RPC repsonse format
type JSONRPCRequest struct {
  JSONRPC string        `json:"jsonrpc"`
  Method  string        `json:"method"`
  ID      int64         `json:"id"`
  Params  []interface{} `json:"params"`
}

// Base struct
type ResponseBase struct {
  JSONRPC string `json:"jsonrpc"`
  ID      int64  `json:"id"`
}

// Response struct based on below RPC methods
type Response struct {
  ResponseBase
  Result string `json:"result"`
}

// ToJSON marshals a JSONRPCRequest into JSON
func (req *JSONRPCRequest) ToJSON() ([]byte, error) {
  s, err := json.Marshal(req)
  if err != nil {
    return nil, err
  }
  return s, nil
}

// Get logs given an array of topics
func (client *EthereumClient) Eth_getLogs(topics string[]) (string, error) {
  reqBody := JSONRPCRequest{
    JSONRPC: "2.0",
    ID:      1,
    Method:  "eth_sendRawTransaction",
    Params:  []interface{}{topics},
  }
  res, err := client.issueRequest(&reqBody)
  if err != nil {
    return "", err
  }

  var clientResp Response
  err = json.Unmarshal(res, &clientResp)
  if err != nil {
    return "", err
  }
  return clientResp.Result, nil
}

Das EthereumClientkann in einem anderen Paket wie folgt instanziiert werden:

// Global client connection
var client = EthereumClient{}

// provider = e.g. 'localhost:8545'
func ConnectToRPC(provider string) {
  client = EthereumClient{provider}
}

Dies clientkann nun verwendet werden, um einen neuen Filter zu starten und die Protokolle von diesem Filter abzurufen.

Ich habe kein spezifisches Beispiel für diesen Anwendungsfall, aber hier finden Sie einige Beispiele für RPC-Anforderungen in Go.

Sie können die Vertragsadresse als Parameter zum eth_getLogs-Aufruf hinzufügen:

curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":["YOUR_CONTRACT_ADDRESS"]}],"id":74}'

Wenn Sie daran interessiert sind, ständig nach Ereignisaktualisierungen abzufragen, können Sie zuerst einen Filter mit eth_newFilter erstellen und dann mit eth_getFilterChanges nach Aktualisierungen fragen .