Betrachten Sie die folgende Funktion aus einem Soliditätsvertrag:
function createProduct(uint _price, string memory _desc) public payable{
emit UserLedgerUpdated(_desc, -1*int(msg.value));
}
Ich möchte, dass mein Dapp ein einfaches Hauptbuch wie das folgende anzeigt:
Created Shoes priced at 100 Wei for a Total Cost of 2345 Wei
Ich habe hier zwei Möglichkeiten:
Fangen Sie das UserLedgerUpdated
Ereignis in der Dapp
Verwenden Sie die Etherscan-API , um die txn-Details abzurufen
Meine Fragen sind:
a) Wenn ich mich für Wahl 2 entscheide (dh txn-Details lesen), kann ich das Ausgeben von Ereignissen vermeiden. Da Ereignisse protokolliert werden und Platz belegen, würden sie Gas kosten und sind daher teurer als das kostenlose Lesen von txn-Details. Ist mein Verständnis richtig?
b) Beim Lesen der ethscan-API erhalte ich die Eingabe für die Funktion als Hex. Ich kann es verwenden web3.toAscii
, um es in eine Zeichenfolge zu konvertieren, aber beachten Sie, dass das erste Argument der Funktion tatsächlich eine Zahl ist. Wenn ich daher Eingabedaten in Beispieltransaktion umwandle , erhalte ich {@Shoes
anstelle von 123Shoes
. Gibt es eine Möglichkeit, die Hex-Daten, die wir von der Ethrscan-API erhalten, richtig umzuwandeln?
price
Variable ist, die eine Zahl ist, keine Zeichenfolge, und 0x7B ist zufällig { in ASCII. Sie können die abi- und die tx-Daten der Funktion an die web3.eth.abi.decodeParameters
Funktion übergeben, nachdem Sie die Funktionssignatur (die ersten 4 Bytes nach 0x) entfernt haben. Dadurch werden die decodierten Daten zurückgegeben.
Amarsch
Liki Crus