Pythonを使用してチェーンIDをbase58でエンコードするにはどうすればよいですか?
3 回答
- 投票
-
- 2019-02-17
あなたのマジックバイトは間違っているようです.元のバイト値から10進バイト値を取得し、それらを16進数に変換してから、先行ゼロを埋め込むと、次のようになります.
>>> struct.unpack('>L', b'\x00\x57\x52\x00')[0] 5722624
この値は期待される結果を生み出すはずです:
>>> 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'
-
ええ5722624は正しいマジックバイトです:Yeah 5722624 is the right magicbyte:
- 1
- 2019-02-17
- Stephen Andrews
-
- 2019-02-16
実際には2バイトのデータ(4つの16進文字)しか取得していないようです.得られた結果をデコードしてこれを確認しましたが、指定されたマジックバイトに対して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文字(4 hexバイト)または `self.payload [2:10]`を取得する必要があります.zeronetでは、承認ペイロードは次のようになります. `023bb717ee882891d7be5b881cefa98946800e3d67b5d01b4237b3618709defb51ec37c3e100000518ae`、ここで、` 3bb717ee`はチェーンIDですが、これは `Net1BPz7FKbUqsY`に変換されます. 上記の質問を少し編集しました.あなたのご親切に感謝します.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')
Tezosがベーキングまたは承認操作のペイロードに署名する必要がある場合、バイト0はベーキング操作の場合は0x01になり、承認操作の場合は0x02になります.オペレーションペイロードのバイト1〜5には、チェーンID(ネットワークとも呼ばれます)が含まれています.チェーンIDは、この仕様:
結果のチェーンIDは、
NetXdQprcVkpaWU
(2019年2月16日現在アクティブなメインネットチェーンID)のような文字列になります.Vitalikのpybitcointoolsモジュールを使用して、バイト1〜5の4バイトフィールドをbase58でエンコードされたNet(15)形式に変換するにはどうすればよいですか?
scripts/b58_prefix.py
のスクリプトを使用して、bitcoin.bin_to_b58check
関数に渡す適切なマジックバイトを決定しようとしましたが、取得できません.適切な結果:これが私のコードです:
zeronetでは、承認ペイロードは次のようになります. zeronetでは
NetXSzLHKwSumh7
である必要があります.