Für Entwickler / JSON-RPC
Abweichungen von Ethereum
Pickle hat die Form von Ethereum, ist ihm aber nicht äquivalent. Das ist die vollständige Liste der Stellen, an denen ein Standard-Client eine Antwort bekommt, die er nicht erwartet hat, geordnet danach, wie viel Zeit jede kostet, wenn man sie auf die harte Tour herausfindet.
Revert-Gründe sind nicht dekodierbar
error.data wird nie gefüllt
A revert arrives as message text - "execution reverted: 0x<returndata>" - and error.data is absent.
Libraries decode custom errors and revert strings out of error.data, so on this chain they cannot. ethers and viem will both surface the raw message instead of a decoded error. If you need the reason, parse the hex out of the message yourself and decode it against your own ABI.
Wenn Sie den Grund brauchen: Die Rückgabedaten stehen im Text der Nachricht, und Sie können sie selbst dekodieren:
try {
await client.readContract({ /* … */ });
} catch (err) {
// "execution reverted: 0x08c379a0…"
const hex = String(err.message).match(/0x[0-9a-fA-F]+/)?.[0];
// Decode that hex against your own ABI's errors, or against Error(string).
}Es gibt keinen historischen Zustand
eth_getBalance, eth_getTransactionCount, eth_getCode und eth_getStorageAt parsen die Adresse und lesen dann den zuletzt veröffentlichten Snapshot. Der Blockparameter wird angenommen und stillschweigend ignoriert - eine Anfrage nach einem Guthaben bei Block 100 meldet keinen Fehler, sie antwortet mit dem Guthaben von jetzt.
eth_call und eth_estimateGas tun dasselbe und ignorieren zusätzlich gas, gasPrice und nonce, die Sie ihnen mitgeben: Die Simulation läuft immer beim Block-Gaslimit von 30.000.000 gegen den jüngsten Zustand.
Diese Abweichung scheitert still, deshalb steht sie an zweiter Stelle
Jedes Muster im Stil eines Archivs - ein historisches Guthaben lesen, den Zustand bei einem vergangenen Block nachspielen, einen Snapshot berechnen - liefert hier selbstbewusste, plausible, falsche Antworten statt eines Fehlers. Lesen Sie für alles Historische stattdessen aus dem Explorer.
Block-Tags fallen zusammen
latest, pending, safe und finalized lösen alle auf dasselbe auf: die aufbewahrte Spitze. Und earliest löst auf den frühesten aufbewahrten Block auf, nicht auf Block 0 - er wandert also nach vorn, während das Fenster gleitet.
EIP-1898-Objekte werden angenommen: { blockNumber } oder { blockHash }, wobei ein Hash über den Index aufgelöst wird und null antwortet, sobald er nicht mehr aufbewahrt wird. Alles andere ist -32602 "block tag".
Ein Client, der safe von finalized unterscheidet, um zu entscheiden, wann er einem Ergebnis traut, bekommt von dieser Chain kein Signal. Finalität ist hier das Settlement auf L1 und über diese Tags überhaupt nicht sichtbar.
Roots und Blooms sind null
Sowohl bei Blöcken als auch bei Quittungen sind stateRoot, transactionsRoot und receiptsRoot null, und logsBloom besteht aus 512 Nullzeichen.
Zwei Folgen. Ein Client, der Roots verifiziert, kann hier nichts verifizieren. Und ein Client, der vor dem Abholen von Logs über den Bloom vorfiltert, trifft nichts - filtern Sie mit eth_getLogs, das einen echten Index liest.
Die Header haben ansonsten sauber die Cancun-Form, einschließlich mixHash, withdrawalsRoot, blobGasUsed, excessBlobGas und parentBeaconBlockRoot. mixHash ist tragend statt dekorativ: Ohne ihn lehnt jeder auf revm gebaute Client, forge script eingeschlossen, den Header mit prevrandao not set ab, bevor er simuliert.
Felder von Quittung und Transaktion
typeist immer"0x0", welchen Envelope Sie auch tatsächlich gesendet haben, und eine Transaktion meldet einen einzigen flachengasPrice- wedermaxFeePerGasnochmaxPriorityFeePerGasoderaccessListkommen zurück. Typisierte Transaktionen werden auf dem Weg hinein angenommen; die Antwortform bildet den Typ schlicht nicht ab.cumulativeGasUsedist das eigenegasUseddieser Transaktion, keine laufende Summe für den Block. Es über einen Block zu summieren zählt nichts doppelt, sagt Ihnen aber auch nichts.blockHashundblockNumbersindnullzwischen der Ausführung und der EVM-Versiegelung. In diesem Fenster existiert eine Quittung, „Quittung ist nicht null" ist also nicht derselbe Test wie „in einem Block enthalten".- Eine Transaktion trägt nicht standardmäßige Zugaben -
raw,miniBlockNumber,miniBlockHash- und eine Quittung trägt die letzten beiden. Sie sind nützlich, und sie sind nicht portabel. eth_getBlockByNumbermitfullTransactions: truekann ein gemischtes Array zurückgeben: Objekte für Transaktionen, deren Quittungen noch indexiert sind, nackte Hash-Strings für die bereits verdrängten.eth_getBlockReceiptslässt verdrängte Quittungen stillschweigend aus, das Array kann also kürzer sein als die Transaktionsliste des Blocks.
logIndex ist pro Transaktion
logIndex wird über die Logs seiner eigenen Quittung durchnummeriert, nicht über den Block. Zwei Logs in einem Block können beide logIndex 0 haben.
Wenn Sie einen Ereignisspeicher auf (blockNumber, logIndex) schlüsseln - den üblichen zusammengesetzten Primärschlüssel eines Indexers -, bekommen Sie Kollisionen. Nehmen Sie transactionHash dazu.
Pending ist kein Mempool
Es gibt keinen öffentlichen Mempool, in dem etwas pending sein könnte. Ein Hash erreicht eth_newPendingTransactionFilter und das Abonnement newPendingTransactions erst nachdem die Transaktion ausgeführt und indexiert wurde.
Es ist also ein Strom ausgeführter Transaktionen unter einem irreführenden Namen. Sie können nicht nach eingehenden Transaktionen Ausschau halten, bevor sie landen, und über diese Schnittstelle gibt es nichts, wovor man sich drängeln könnte.
Methoden, die mit Konstanten antworten
Zwei Methoden sehen aus, als funktionierten sie, und geben Werte zurück, die keine Messungen sind. Beide sind in der Referenz gekennzeichnet, und beide sind gefährlicher als eine Methode, die einen Fehler meldet:
eth_feeHistoryliest nurblockCount, ignoriertnewestBlockundrewardPercentilesvollständig und gibtbaseFeePerGasals wiederholtes0x1mitgasUsedRatioals wiederholtes0.0zurück.eth_createAccessListgibt{ accessList: [], gasUsed: "0x0" }zurück, ohne die Parameter oder den Zustand anzusehen.
Eine dritte Gruppe antwortet ehrlich, aber leer, weil die Konzepte nicht zutreffen: eth_accounts ist immer leer, eth_mining false, eth_hashrate null, und die vier Uncle-Methoden geben null oder null zurück, ohne ihre Parameter zu prüfen.
Namensräume, die es nicht gibt
rpc_modules bewirbt eth, net, web3 und pickle. Nicht vorhanden und nicht implementiert: debug, trace, txpool und admin. Es gibt also kein debug_traceTransaction - für Aufruf-Traces nehmen Sie den Explorer, der sie hat.
Die Signiermethoden sind registriert und verweigern absichtlich: eth_sendTransaction, eth_sign, eth_signTransaction, personal_sign und eth_coinbase antworten alle mit -32601. Der Node hält keine Nutzerschlüssel - signieren Sie lokal und nutzen Sie eth_sendRawTransaction.