graphprotocol / graphprotocol/graph-node
Unexpected Behaviour Hex-Encoding Negative `BigInt`s
Nessuno ha ancora preso questa issue.
- Lingua principale
- Rust
- Stelle
- 3.2k
- Fork
- 1.1k
- Merge medio
- 4g 1h
- PR unite (30g)
- 1
Descrizione
I would like to report some behaviour that seems unexpected to me.
What is the current behavior?
Encoding a negative BigInt value will return the hex of its absolute value. So -42 will be encoded as 0x2a.
What is the expected behavior?
Looking into the code, it looks like num::BigInt::to_bytes_be returns the big-endian bytes for its absolute value. This causes typeConversions.bigIntToHex to encode absolute values of its BigInt parameter.
This is a bit unexpected to me, and I would have expected either:
- To sign prefix the hex value (so
42becomes0x2aand-42becomes-0x2a). This is more inline with hownum::BigIntwould hex-format values. - To hex encode the value in 2's compliment notation. (so
42becomes0x2aand-42becomes0xd6). In looking at the code, this encoding implementation requires no leading 0s in the hex representation. This would mean that with 2's compliment, there would be multiple numbers with the same hex representation (for example255would be0xffand-1would also be0xff). - Disallow hex-encoding negative big integers. From the documentation for the
typeConversions.bigIntToHeximplementation in theHostExports, it mentionsgo-ethereumencoding rules as the reference. By those rules, hex marshalling for negative numbers is explicitly prohibited, so following that here would also make sense:Negative integers are not supported at this time. Attempting to marshal them will return an error. Values larger than 256bits are rejected by Unmarshal but will be marshaled without error.
Unfortunately, all of these suggestions would be breaking changes (which I imagine should be avoided for subgraph host function implementations).
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia leggendo l’implementazione di typeConversions.bigIntToHex in HostExports e il comportamento di num::BigInt::to_bytes_be. Confronta il riferimento di codifica documentato di go-ethereum con i tre comportamenti proposti per i valori negativi, quindi determina quale criterio sia accettabile senza compromettere la compatibilità delle funzioni host. Il lavoro è completato quando il comportamento e le implicazioni sulla compatibilità sono stati decisi e sono coperti dai test o dalla documentazione pertinenti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- rust
- Ambito
- api, blockchain
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100