Python을 사용하여 체인 ID를 base58로 인코딩하려면 어떻게해야합니까?
3 대답
- 투표
-
- 2019-02-17
magicbyte가 잘못된 것 같습니다.원본에서 십진수 바이트 값을 가져 와서 16 진수로 변환 한 다음 앞에 0으로 채우면 다음과 같은 결과가 나타납니다.
<사전> <코드> > > >struct.unpack ( '> L',b '\ x00 \ x57 \ x52 \ x00') [0] 5722624이 값은 예상 된 결과를 생성해야합니다.
<사전> <코드> > > >페이로드='023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae' > > >mb=struct.unpack ( '> L',b '\ x00 \ x57 \ x52 \ x00') [0] > > >chainid=bytes.fromhex (페이로드 [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'
-
예 5722624는 올바른magicbyte입니다.Yeah 5722624 is the right magicbyte:
- 1
- 2019-02-17
- Stephen Andrews
-
- 2019-02-16
실제로 2 바이트의 데이터 (16 진수 4 자) 만 가져 오는 것 같습니다.나는 당신이 얻은 결과를 디코딩하여 이것을 확인했으며 주어진 매직 바이트에 대해 2 바이트의 데이터 만 반환합니다.
다음과 같이 변경해보세요.
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)
-
감사합니다. 이것이 문제의 일부입니다. 8 자 (16 진수 4 바이트) 또는`self.payload [2:10]`를 가져와야합니다.제로 넷에서 보증 페이로드는 다음과 같습니다.`023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae`,여기서`3bb717ee`는 체인 ID이지만 제로 넷에서는`NetXSz7FKwSuqsY`로 변환됩니다. 위의 질문을 약간 수정했습니다.모든 도움에 다시 한 번 감사드립니다.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
먼저 감사합니다.블록 서명 미스터리를 해결하는 데 도움을 주셨습니다. :) 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')
테 조스가 베이킹 또는 보증 작업 페이로드에 서명해야 할 때 바이트 0은 베이킹 작업의 경우 0x01이되고 보증 작업의 경우 0x02가됩니다. 작업 페이로드의 바이트 1-5에는 이 사양 :
결과 체인 ID는
NetXdQprcVkpaWU
(2019 년 2 월 16 일 현재 활성화 된 메인 넷 체인 ID)와 같은 문자열이됩니다.Vitalik의pybitcointools 모듈을 사용하여 1-5 바이트의 4 바이트 필드를base58로 인코딩 된 Net (15) 형식으로 어떻게 변환합니까?
scripts/b58_prefix.py
의 스크립트를 사용하여bitcoin.bin_to_b58check
함수에 전달할 적절한magicbyte를 결정하려고했지만 표시되지 않습니다. 적절한 결과 :다음은 내 코드입니다.
zeronet에서 보증 페이로드는 다음과 같습니다.
023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae
,여기서3bb717ee
는 체인 ID이지만 변환은Net1BPz7FKbUqsY
입니다. zeronet에서NetXSzLHKwSumh7
이어야합니다.