Como faço para o Base58 codificando o ID da corrente usando o Python?
3 respostas
- votos
-
- 2019-02-17
Seumagicbytepareceestarerrado.Se vocêfizer os valores dobyte decimal do original,convertê-lospara Hex,em seguida,preenchê-lo com um zero líder,você obterá
>>> struct.unpack('>L', b'\x00\x57\x52\x00')[0] 5722624
Este valor deveproduzir o resultadoesperado:
>>> 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'
-
Sim 5722624 é omagicbyte certo:Yeah 5722624 is the right magicbyte:
- 1
- 2019-02-17
- Stephen Andrews
-
- 2019-02-16
Parece que você sóestá agarrando 2bytes de dados (4 Chars Hex).Eu verifiqueiisso decodificando o resultado que você recebeu,e só retornando doisbytes de dadospara obytemágico dado.
Tentefazer a seguinte alteração:
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)
-
Obrigado,issofazparte doproblema -euprecisopegar 8 caracteres (4bytes hexadecimais),ou 'self.payload [2:10] ``Emzeronet,umendossode carga útilesta aparência:`023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae`,onde`3bb717ee`é o ID decadeia,masque se converteem`Net1BPz7FKbUqsY`e deve ser`NetXSzLHKwSumh7`emzeronet. Eueditei apergunta acima umpouco.Obrigadonovamenteportoda a sua ajuda.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
Primeiro detudo,muito obrigado!Vocême ajudou a resolver omistério da assinatura dobloco :) Vocêpode usar pytezos.encoding pacote:
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 os Tezosprecisam assinar uma carga de operação de cozedura ouendosso,o Byte 0 será um 0x01para uma operação de cozimento ou 0x02para uma operação deendosso. Bytes 1-5 Na carga útil da operação contêm aidentificação da cadeia (de outraforma conhecida como rede),quepode ser codificadano Base58 usando Estaespecificação :
O ID da cadeia resultante será uma string como
NetXdQprcVkpaWU
(o ID da cadeia Mainnet atualmente ativo apartir de 16 defevereiro de 2019).Comofaçopara converter o campo de 4bytesem bytes 1-5noformato NET (15) codificado (15) codificado Base58 usando omódulo PybitcoINTOOLS do Vitalik?
Eutentei usar o scriptem script
scripts/b58_prefix.py
para determinar omagicbyte apropriadoparapassarpara obitcoin.bin_to_b58check
função,maseunãoestou recebendo o resultado apropriado:Aquiestá omeu código:
Em zeronet,umendosso de carga útilesta aparência:
023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae
,onde3bb717ee
é a ID de cadeia,mas que se converteemNet1BPz7FKbUqsY
e deve serNetXSzLHKwSumh7
em zeronet.