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_getlogs
method 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!
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 0xb3904758c0d3bfc25746c47caa45b01da8930e19
von 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 EthereumClient
kann 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 client
kann 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 .