Come faccio a codificare in base58 l'ID della catena usando Python?
3 risposta
- voti
-
- 2019-02-17
Iltuomagicbyte sembraessere sbagliato.Seprendii valori deibyte decimali dall'originale,li convertiin esadecimale,quindi aggiungi uno zeroiniziale,ottieni
>>> struct.unpack('>L', b'\x00\x57\x52\x00')[0] 5722624
Questo valore dovrebbeprodurreil risultato atteso:
>>> payload = '023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae' >>> mb = struct.unpack('>L', b'\x00\x57\x52\x00')[0] >>> chainid = bytes.fromhex(payload[2:10]) >>> bitcoin.bin_to_b58check(chainid, magicbyte=mb) 'NetXSzLHKwSumh7'
Your magicbyte seems to be wrong. If you take the decimal byte values from the original, convert them to hex, then pad it with a leading zero, you get
>>> struct.unpack('>L', b'\x00\x57\x52\x00')[0] 5722624
This value should produce the expected result:
>>> payload = '023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae' >>> mb = struct.unpack('>L', b'\x00\x57\x52\x00')[0] >>> chainid = bytes.fromhex(payload[2:10]) >>> bitcoin.bin_to_b58check(chainid, magicbyte=mb) 'NetXSzLHKwSumh7'
-
Sì 5722624 èilmagicbytegiusto:Yeah 5722624 is the right magicbyte:
- 1
- 2019-02-17
- Stephen Andrews
-
- 2019-02-16
Sembra chetu stiaeffettivamente acquisendo solo 2byte di dati (4 caratteriesadecimali).L'ho verificato decodificandoil risultato ottenutoe restituendo solo duebyte di datiperilbytemagico specificato.
Prova ad apportare la seguentemodifica:
def get_chain_id(self): chainid = bytes.fromhex(self.payload[2:10]) return bitcoin.bin_to_b58check(chainid, magicbyte=5722583)
It looks like you are only actually grabbing 2 bytes of data (4 hex chars). I verified this by decoding the result you got, and it only returning two bytes of data for the given magic byte.
Try making the following change:
def get_chain_id(self): chainid = bytes.fromhex(self.payload[2:10]) return bitcoin.bin_to_b58check(chainid, magicbyte=5722583)
-
Grazie,questofaparte delproblema: devoprendere 8 caratteri (4byteesadecimali) o `self.payload [2:10]`.Su zeronet,unpayload di approvazione hail seguente aspetto: `023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae`,dove` 3bb717ee` è l'id della catena,ma viene convertitoin `Net1BUqS7` Homodificato unpo 'la domanda sopra.Grazie ancorapertuttoil vostro aiuto.Thanks, this is part of the problem - I need to grab 8 characters (4 hex bytes), or `self.payload[2:10]`. On zeronet, an endorsement payload looks like this: `023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae`, where `3bb717ee` is the chain id, but that converts to `Net1BPz7FKbUqsY` and it should be `NetXSzLHKwSumh7` on zeronet. I edited the question above a bit. Thanks again for all your help.
- 1
- 2019-02-17
- Luke Youngblood
-
- 2019-02-26
Prima ditutto,moltegrazie!Mi hai aiutato a risolvereilmistero dellafirma delblocco :) Puoi utilizzareilpacchetto pytezos.encoding :
from pytezos.encoding import base58_encode def get_chain_id(self): chainid = bytes.fromhex(self.payload[2:10]) return base58_encode(chain_id, b'Net')
First of all, many thanks! You've helped me with solving the block signature mystery :) You can use pytezos.encoding package:
from pytezos.encoding import base58_encode def get_chain_id(self): chainid = bytes.fromhex(self.payload[2:10]) return base58_encode(chain_id, b'Net')
Quando Tezos devefirmare unpayload di un'operazione di cottura o di approvazione,ilbyte 0 sarà 0x01per un'operazione di cottura o 0x02per un'operazione di approvazione. Ibyte 1-5nelpayload dell'operazione contengono l'ID della catena (altrimentinoto come Rete),chepuòessere codificatoin base58 utilizzando questa specifica :
L'ID della catena risultante sarà una stringa come
NetXdQprcVkpaWU
(l'ID della catenamainnet attualmente attivo al 16febbraio 2019).Comeposso convertireil campo a 4bytein byte 1-5nelformato Net (15) codificatobase58 utilizzandoilmodulopybitcointools di Vitalik?
Hoprovato a utilizzare lo scriptin
scripts/b58_prefix.py
per determinareilmagicbyte appropriato dapassare allafunzionebitcoin.bin_to_b58check
,manon ottengoil risultato appropriato:Eccoilmio codice:
Su zeronet,unpayload di approvazione è simile a questo:
023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae
,dove3bb717ee
è l'ID della catena e YFU dovrebbeessereNetXSzLHKwSumh7
su zeronet.