mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-19 09:53:47 +01:00
Use Bech32m encoding for v1+ segwit addresses
This also includes updates to the Python test framework implementation, test vectors, and release notes.
This commit is contained in:
parent
25b1c6e13d
commit
fe5e495c31
@ -15,7 +15,7 @@ import os
|
||||
from itertools import islice
|
||||
from base58 import b58encode_chk, b58decode_chk, b58chars
|
||||
import random
|
||||
from segwit_addr import bech32_encode, decode_segwit_address, convertbits, CHARSET
|
||||
from segwit_addr import bech32_encode, decode_segwit_address, convertbits, CHARSET, Encoding
|
||||
|
||||
# key types
|
||||
PUBKEY_ADDRESS = 0
|
||||
@ -32,6 +32,7 @@ PRIVKEY_REGTEST = 239
|
||||
OP_0 = 0x00
|
||||
OP_1 = 0x51
|
||||
OP_2 = 0x52
|
||||
OP_3 = 0x53
|
||||
OP_16 = 0x60
|
||||
OP_DUP = 0x76
|
||||
OP_EQUAL = 0x87
|
||||
@ -44,6 +45,7 @@ script_prefix = (OP_HASH160, 20)
|
||||
script_suffix = (OP_EQUAL,)
|
||||
p2wpkh_prefix = (OP_0, 20)
|
||||
p2wsh_prefix = (OP_0, 32)
|
||||
p2tr_prefix = (OP_1, 32)
|
||||
|
||||
metadata_keys = ['isPrivkey', 'chain', 'isCompressed', 'tryCaseFlip']
|
||||
# templates for valid sequences
|
||||
@ -65,29 +67,39 @@ templates = [
|
||||
]
|
||||
# templates for valid bech32 sequences
|
||||
bech32_templates = [
|
||||
# hrp, version, witprog_size, metadata, output_prefix
|
||||
('bc', 0, 20, (False, 'main', None, True), p2wpkh_prefix),
|
||||
('bc', 0, 32, (False, 'main', None, True), p2wsh_prefix),
|
||||
('bc', 1, 2, (False, 'main', None, True), (OP_1, 2)),
|
||||
('tb', 0, 20, (False, 'test', None, True), p2wpkh_prefix),
|
||||
('tb', 0, 32, (False, 'test', None, True), p2wsh_prefix),
|
||||
('tb', 2, 16, (False, 'test', None, True), (OP_2, 16)),
|
||||
('bcrt', 0, 20, (False, 'regtest', None, True), p2wpkh_prefix),
|
||||
('bcrt', 0, 32, (False, 'regtest', None, True), p2wsh_prefix),
|
||||
('bcrt', 16, 40, (False, 'regtest', None, True), (OP_16, 40))
|
||||
# hrp, version, witprog_size, metadata, encoding, output_prefix
|
||||
('bc', 0, 20, (False, 'main', None, True), Encoding.BECH32, p2wpkh_prefix),
|
||||
('bc', 0, 32, (False, 'main', None, True), Encoding.BECH32, p2wsh_prefix),
|
||||
('bc', 1, 32, (False, 'main', None, True), Encoding.BECH32M, p2tr_prefix),
|
||||
('bc', 2, 2, (False, 'main', None, True), Encoding.BECH32M, (OP_2, 2)),
|
||||
('tb', 0, 20, (False, 'test', None, True), Encoding.BECH32, p2wpkh_prefix),
|
||||
('tb', 0, 32, (False, 'test', None, True), Encoding.BECH32, p2wsh_prefix),
|
||||
('tb', 1, 32, (False, 'test', None, True), Encoding.BECH32M, p2tr_prefix),
|
||||
('tb', 3, 16, (False, 'test', None, True), Encoding.BECH32M, (OP_3, 16)),
|
||||
('bcrt', 0, 20, (False, 'regtest', None, True), Encoding.BECH32, p2wpkh_prefix),
|
||||
('bcrt', 0, 32, (False, 'regtest', None, True), Encoding.BECH32, p2wsh_prefix),
|
||||
('bcrt', 1, 32, (False, 'regtest', None, True), Encoding.BECH32M, p2tr_prefix),
|
||||
('bcrt', 16, 40, (False, 'regtest', None, True), Encoding.BECH32M, (OP_16, 40))
|
||||
]
|
||||
# templates for invalid bech32 sequences
|
||||
bech32_ng_templates = [
|
||||
# hrp, version, witprog_size, invalid_bech32, invalid_checksum, invalid_char
|
||||
('tc', 0, 20, False, False, False),
|
||||
('tb', 17, 32, False, False, False),
|
||||
('bcrt', 3, 1, False, False, False),
|
||||
('bc', 15, 41, False, False, False),
|
||||
('tb', 0, 16, False, False, False),
|
||||
('bcrt', 0, 32, True, False, False),
|
||||
('bc', 0, 16, True, False, False),
|
||||
('tb', 0, 32, False, True, False),
|
||||
('bcrt', 0, 20, False, False, True)
|
||||
# hrp, version, witprog_size, encoding, invalid_bech32, invalid_checksum, invalid_char
|
||||
('tc', 0, 20, Encoding.BECH32, False, False, False),
|
||||
('bt', 1, 32, Encoding.BECH32M, False, False, False),
|
||||
('tb', 17, 32, Encoding.BECH32M, False, False, False),
|
||||
('bcrt', 3, 1, Encoding.BECH32M, False, False, False),
|
||||
('bc', 15, 41, Encoding.BECH32M, False, False, False),
|
||||
('tb', 0, 16, Encoding.BECH32, False, False, False),
|
||||
('bcrt', 0, 32, Encoding.BECH32, True, False, False),
|
||||
('bc', 0, 16, Encoding.BECH32, True, False, False),
|
||||
('tb', 0, 32, Encoding.BECH32, False, True, False),
|
||||
('bcrt', 0, 20, Encoding.BECH32, False, False, True),
|
||||
('bc', 0, 20, Encoding.BECH32M, False, False, False),
|
||||
('tb', 0, 32, Encoding.BECH32M, False, False, False),
|
||||
('bcrt', 0, 20, Encoding.BECH32M, False, False, False),
|
||||
('bc', 1, 32, Encoding.BECH32, False, False, False),
|
||||
('tb', 2, 16, Encoding.BECH32, False, False, False),
|
||||
('bcrt', 16, 20, Encoding.BECH32, False, False, False),
|
||||
]
|
||||
|
||||
def is_valid(v):
|
||||
@ -127,8 +139,9 @@ def gen_valid_bech32_vector(template):
|
||||
hrp = template[0]
|
||||
witver = template[1]
|
||||
witprog = bytearray(os.urandom(template[2]))
|
||||
dst_prefix = bytearray(template[4])
|
||||
rv = bech32_encode(hrp, [witver] + convertbits(witprog, 8, 5))
|
||||
encoding = template[4]
|
||||
dst_prefix = bytearray(template[5])
|
||||
rv = bech32_encode(hrp, [witver] + convertbits(witprog, 8, 5), encoding)
|
||||
return rv, dst_prefix + witprog
|
||||
|
||||
def gen_valid_vectors():
|
||||
@ -186,22 +199,23 @@ def gen_invalid_bech32_vector(template):
|
||||
hrp = template[0]
|
||||
witver = template[1]
|
||||
witprog = bytearray(os.urandom(template[2]))
|
||||
encoding = template[3]
|
||||
|
||||
if no_data:
|
||||
rv = bech32_encode(hrp, [])
|
||||
rv = bech32_encode(hrp, [], encoding)
|
||||
else:
|
||||
data = [witver] + convertbits(witprog, 8, 5)
|
||||
if template[3] and not no_data:
|
||||
if template[4] and not no_data:
|
||||
if template[2] % 5 in {2, 4}:
|
||||
data[-1] |= 1
|
||||
else:
|
||||
data.append(0)
|
||||
rv = bech32_encode(hrp, data)
|
||||
rv = bech32_encode(hrp, data, encoding)
|
||||
|
||||
if template[4]:
|
||||
if template[5]:
|
||||
i = len(rv) - random.randrange(1, 7)
|
||||
rv = rv[:i] + random.choice(CHARSET.replace(rv[i], '')) + rv[i + 1:]
|
||||
if template[5]:
|
||||
if template[6]:
|
||||
i = len(hrp) + 1 + random.randrange(0, len(rv) - len(hrp) - 4)
|
||||
rv = rv[:i] + rv[i:i + 4].upper() + rv[i + 4:]
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.21.0**):
|
||||
BIPs that are implemented by Bitcoin Core (up-to-date up to **v22.0**):
|
||||
|
||||
* [`BIP 9`](https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki): The changes allowing multiple soft-forks to be deployed in parallel have been implemented since **v0.12.1** ([PR #7575](https://github.com/bitcoin/bitcoin/pull/7575))
|
||||
* [`BIP 11`](https://github.com/bitcoin/bips/blob/master/bip-0011.mediawiki): Multisig outputs are standard since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)).
|
||||
@ -50,3 +50,4 @@ BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.21.0**):
|
||||
* [`BIP 325`](https://github.com/bitcoin/bips/blob/master/bip-0325.mediawiki): Signet test network is supported as of **v0.21.0** ([PR 18267](https://github.com/bitcoin/bitcoin/pull/18267)).
|
||||
* [`BIP 339`](https://github.com/bitcoin/bips/blob/master/bip-0339.mediawiki): Relay of transactions by wtxid is supported as of **v0.21.0** ([PR 18044](https://github.com/bitcoin/bitcoin/pull/18044)).
|
||||
* [`BIP 340`](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki) [`341`](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki) [`342`](https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki): Validation rules for Taproot (including Schnorr signatures and Tapscript leaves) are implemented as of **v0.21.0** ([PR 19953](https://github.com/bitcoin/bitcoin/pull/19953)), without mainnet activation.
|
||||
* [`BIP 350`](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki): Addresses for native v1+ segregated Witness outputs use Bech32m instead of Bech32 as of **v22.0** ([PR 20861](https://github.com/bitcoin/bitcoin/pull/20861)).
|
||||
|
13
doc/release-notes-20861.md
Normal file
13
doc/release-notes-20861.md
Normal file
@ -0,0 +1,13 @@
|
||||
Updated RPCs
|
||||
------------
|
||||
|
||||
- Due to [BIP 350](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki)
|
||||
being implemented, behavior for all RPCs that accept addresses is changed when
|
||||
a native witness version 1 (or higher) is passed. These now require a Bech32m
|
||||
encoding instead of a Bech32 one, and Bech32m encoding will be used for such
|
||||
addresses in RPC output as well. No version 1 addresses should be created
|
||||
for mainnet until consensus rules are adopted that give them meaning
|
||||
(e.g. through [BIP 341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki)).
|
||||
Once that happens, Bech32m is expected to be used for them, so this shouldn't
|
||||
affect any production systems, but may be observed on other networks where such
|
||||
addresses already have meaning (like signet).
|
@ -62,7 +62,7 @@ public:
|
||||
std::vector<unsigned char> data = {(unsigned char)id.version};
|
||||
data.reserve(1 + (id.length * 8 + 4) / 5);
|
||||
ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, id.program, id.program + id.length);
|
||||
return bech32::Encode(bech32::Encoding::BECH32, m_params.Bech32HRP(), data);
|
||||
return bech32::Encode(bech32::Encoding::BECH32M, m_params.Bech32HRP(), data);
|
||||
}
|
||||
|
||||
std::string operator()(const CNoDestination& no) const { return {}; }
|
||||
@ -96,7 +96,7 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
|
||||
}
|
||||
data.clear();
|
||||
const auto dec = bech32::Decode(str);
|
||||
if (dec.encoding == bech32::Encoding::BECH32 && dec.data.size() > 0) {
|
||||
if ((dec.encoding == bech32::Encoding::BECH32 || dec.encoding == bech32::Encoding::BECH32M) && dec.data.size() > 0) {
|
||||
// Bech32 decoding
|
||||
error_str = "";
|
||||
if (dec.hrp != params.Bech32HRP()) {
|
||||
@ -104,6 +104,14 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
|
||||
return CNoDestination();
|
||||
}
|
||||
int version = dec.data[0]; // The first 5 bit symbol is the witness version (0-16)
|
||||
if (version == 0 && dec.encoding != bech32::Encoding::BECH32) {
|
||||
error_str = "Version 0 witness address must use Bech32 checksum";
|
||||
return CNoDestination();
|
||||
}
|
||||
if (version != 0 && dec.encoding != bech32::Encoding::BECH32M) {
|
||||
error_str = "Version 1+ witness address must use Bech32m checksum";
|
||||
return CNoDestination();
|
||||
}
|
||||
// The rest of the symbols are converted witness program bytes.
|
||||
data.reserve(((dec.data.size() - 1) * 5) / 8);
|
||||
if (ConvertBits<5, 8, false>([&](unsigned char c) { data.push_back(c); }, dec.data.begin() + 1, dec.data.end())) {
|
||||
|
@ -6,177 +6,147 @@
|
||||
"x"
|
||||
],
|
||||
[
|
||||
"37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y"
|
||||
"1KyjgD9vFKmFSysJPUqQdXT8Yy5r82D6y74dfsg1ANTteuHJuP2q1aP1WgGX3oetFRtatKVXxPU"
|
||||
],
|
||||
[
|
||||
"dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv"
|
||||
"2CwgfUPJ6BCa16PuFjKeMzLJJUpqnXm9mCtoXVGiGN7s9dNCKfCN5SdT7cu4nMY5omWHPrQLAqYL"
|
||||
],
|
||||
[
|
||||
"MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S"
|
||||
"grEx1jdq4kpgsvorxP5PRyjgbXpvAVpaL5HEcqpDmF6ZpwuqRbzHX64GZ9eUwoSTvmbQb9fnqnh"
|
||||
],
|
||||
[
|
||||
"rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf"
|
||||
"7RSWWNt7pyiZkNnLTuocsLMM6e3c7Mvvq8phtaBVyhuceG37y9r"
|
||||
],
|
||||
[
|
||||
"4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq"
|
||||
"7VXvPTB9ZdTRUS2W1KpcykSA1XHaVrfUGhKvWQXQLMVUNefmaLkF9DFC4fZJ5aMCxmj4HRQcLFGix"
|
||||
],
|
||||
[
|
||||
"7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb"
|
||||
"91bBALqY4D1Mmz4vqnCwdGSB4U1sqnZPrKZ8aHENoT5irq6bB9Nc"
|
||||
],
|
||||
[
|
||||
"17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs"
|
||||
"tc19jm4rn"
|
||||
],
|
||||
[
|
||||
"KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3"
|
||||
"bt1py306q853jeddsuaasstjxjz6l9uehmx8kgpe94lvvwj85rah56asxg35e3"
|
||||
],
|
||||
[
|
||||
"7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th"
|
||||
"tb13u87aul665v37upwmu9a4nh82rj9cv94x5tps52e39e6k56t2ryzqv9mkxa"
|
||||
],
|
||||
[
|
||||
"cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va"
|
||||
"bcrt1rkqk977nr"
|
||||
],
|
||||
[
|
||||
"gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk"
|
||||
"bc10v6wh2rtujsn9hnsyfzzsd9y3rx9n8xhue0agk7c8q9tv3lga7css5jku9rstle93e5fhc8dl"
|
||||
],
|
||||
[
|
||||
"emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs"
|
||||
"tb1q9quwy0k48ne8ppmr7p0jhj6hks7smd7l"
|
||||
],
|
||||
[
|
||||
"7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo"
|
||||
"bcrt1q5l6rmlw2et02krnfgl9uuxp8q30dktcjvuzsw7gyk2ykkkm2td0prkw9de"
|
||||
],
|
||||
[
|
||||
"1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso"
|
||||
"bc1q5ezcdrt4qqmkcqz8n50hgww88gqzfx4m6"
|
||||
],
|
||||
[
|
||||
"31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq"
|
||||
"tb1q5gcna4un84qevljj3wk6rvm97f8f00gwtcu7v258cvn880wkf7gqesasqn"
|
||||
],
|
||||
[
|
||||
"DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN"
|
||||
"bcrt1qtevjqsc85md7pa0CQEnpvdx977juj30usufphy"
|
||||
],
|
||||
[
|
||||
"2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i"
|
||||
"bc1qret0yy8cmhsh6vw87lxtzt7w0sk4026l5qrvy7"
|
||||
],
|
||||
[
|
||||
"7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos"
|
||||
"tb1qnw0xfgkucr4ysapsj8gd0u40fpj05n8cn24unkql8mc4ckkcp0mqc7acjd"
|
||||
],
|
||||
[
|
||||
"1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu"
|
||||
"bcrt1qu26l525vmxfv59gxm2r0c8alnkpzmat2mga2qw"
|
||||
],
|
||||
[
|
||||
"2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb"
|
||||
"bc1prjkeqgknynar5tj6v76yn3u27rep8jf366kmhglq898yn3aczk9ss73nrl"
|
||||
],
|
||||
[
|
||||
"8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ"
|
||||
"tb1zq0vsl9pta9uwh2txtrmxyedjtqcfkqt5"
|
||||
],
|
||||
[
|
||||
"163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ"
|
||||
"bcrt1suvw5wa9elxy3a43ctljjn8avcmqpzwz5m4tycs"
|
||||
],
|
||||
[
|
||||
"2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu"
|
||||
"gf7t7z22jkuKcEjc8gELEYau3NzgGFLtLNEdMpJKcVt6z7mmvEJHH37y36MNGSmriFaPAbGghdh"
|
||||
],
|
||||
[
|
||||
"461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU"
|
||||
"mn9CPaeodb6L1CtJu1KaLtJhDbYL55Hxwe"
|
||||
],
|
||||
[
|
||||
"2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs"
|
||||
"cTSecEa3nqxF4mgYkGrxRKeWLpXWng6nUgL4sVeAhrNbtdf1z8hz1VFesD492QWZ4JprpRW1Drr"
|
||||
],
|
||||
[
|
||||
"cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn"
|
||||
"4UjQEEvAT4Y9a3mtLFjzhcVBBKz8NiqAMfGhMwaSKgMqatpGT3qWzKY2f9HedshfSaAa439Vn3yNc"
|
||||
],
|
||||
[
|
||||
"gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj"
|
||||
"5ip19k2UhwhpHMK8ym6ZGnLA8J9JvHzv418AwohCMf3WrCfwLhG"
|
||||
],
|
||||
[
|
||||
"nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny"
|
||||
"tc1qe7avhvpmn9le76kxlcvwl69ldm0n66gefjetyn"
|
||||
],
|
||||
[
|
||||
"L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc"
|
||||
"bt1pz4l3ja200jyyhtaxvz4ffm3t33ares72745gwjspttzdllvmte5qs0kd5q"
|
||||
],
|
||||
[
|
||||
"7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ"
|
||||
"tb13wthrv4wkvpxl57d0plyfqjxvzu9qmdzg7eldaeut2hmcpp02mw2q3ep6tw"
|
||||
],
|
||||
[
|
||||
"2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP"
|
||||
"bcrt1rqg9chz23"
|
||||
],
|
||||
[
|
||||
"dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw"
|
||||
"BC102A2J0QF2MX8926EQ3WZGDC45PXL4QN267673J7P7JMJ6VD0RDTAWVQ2ZFNP4JJAW85JXP080"
|
||||
],
|
||||
[
|
||||
"HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX"
|
||||
"tb1qx0shsrwmrl57djkm0yyqdyp02cmpjmlw"
|
||||
],
|
||||
[
|
||||
"4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB"
|
||||
"bcrt17capp7"
|
||||
],
|
||||
[
|
||||
"Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ"
|
||||
"bc1qvgrlqspye3z2ufaekn7qygm7guqjx982l"
|
||||
],
|
||||
[
|
||||
"Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs"
|
||||
"tb1qk8lfs3l8df9gkw69240g0ckg4ywmw9qvmcm0pltxt8udk9szrhxqkhd5n2"
|
||||
],
|
||||
[
|
||||
"6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ"
|
||||
"bcrt1qKW6Cxkky8a7gyvmkw9p3v5l2gx8zgyjtjv7dl7"
|
||||
],
|
||||
[
|
||||
"giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4"
|
||||
"bc1a8xfp7"
|
||||
],
|
||||
[
|
||||
"cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK"
|
||||
"tb1dclvmr"
|
||||
],
|
||||
[
|
||||
"37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig"
|
||||
"bcrt1q26vevm7x046n9h3jg6zsgyd3228ra25ck7jah2"
|
||||
],
|
||||
[
|
||||
"EsYbG4tWWWY45G31nox838qNdzksbPySWc"
|
||||
"BC1PCCNQDKKS5ZQ0AC69MQYQXU8ADGSGE53UY3AXXHJYFDG77Y0WX9AQHEHRL7"
|
||||
],
|
||||
[
|
||||
"nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT"
|
||||
"tb1zys2pfhe9fslxat85y7uc5e78uq7449ct"
|
||||
],
|
||||
[
|
||||
"cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx"
|
||||
"bcrt1slnwcpwf88ffa708xpfkm6a5wsaq9me7y0fmvg3"
|
||||
],
|
||||
[
|
||||
"1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde"
|
||||
"dhBi3wYUjrVsW1pA4XhLjdavSQYSnsECskAoZ1dqLnV8hCSxuo9EZ9tf4cCoxn7fnKgCoJK3mcE"
|
||||
],
|
||||
[
|
||||
"2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU"
|
||||
"2UFHPygbpDdbzmQx688QnMqSunZi97Yn5T7DVBdKyTD7sCfGi5fi8r2ct92FNUZPMm1xswo8Ve8c"
|
||||
],
|
||||
[
|
||||
"ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf"
|
||||
"2yAaXFzjninFv5dn3JnWQ5y9nYkK5ZCMAkDWr4Y9WUiCGa3UiYfs"
|
||||
],
|
||||
[
|
||||
"Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd"
|
||||
"tc1qmfcz6l7gfwwt0tucqgtmhwlkgtd47a3urnjpt4"
|
||||
],
|
||||
[
|
||||
"2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED"
|
||||
],
|
||||
[
|
||||
"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty"
|
||||
],
|
||||
[
|
||||
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5"
|
||||
],
|
||||
[
|
||||
"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2"
|
||||
],
|
||||
[
|
||||
"bc1rw5uspcuh"
|
||||
],
|
||||
[
|
||||
"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90"
|
||||
],
|
||||
[
|
||||
"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P"
|
||||
],
|
||||
[
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7"
|
||||
],
|
||||
[
|
||||
"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du"
|
||||
],
|
||||
[
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv"
|
||||
],
|
||||
[
|
||||
"bc1gmk9yu"
|
||||
"bt1flep4g"
|
||||
]
|
||||
]
|
||||
|
@ -1,533 +1,438 @@
|
||||
[
|
||||
[
|
||||
"1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
|
||||
"76a91465a16059864a2fdbc7c99a4723a8395bc6f188eb88ac",
|
||||
"1LsN3xZdsNiSMiVc45AGBdhtkQZG53tKpx",
|
||||
"76a914d9f0c2ae3652e96389b4481a510f0b2b96da1d0888ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou",
|
||||
"a91474f209f6ea907e2ea48f74fae05782ae8a66525787",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs",
|
||||
"76a91453c0307d6851aa0ce7825ba883c6bd9ad242b48688ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs",
|
||||
"76a91453c0307d6851aa0ce7825ba883c6bd9ad242b48688ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "regtest"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br",
|
||||
"a9146349a418fc4578d10a372b54b45c280cc8c4382f87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr",
|
||||
"eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Kz6UJmQACJmLtaQj5A3JAge4kVTNQ8gbvXuwbmCj7bsaabudb3RD",
|
||||
"55c9bccb9ed68446d1b75273bbce89d7fe013a8acd1625514420fb2aca1a21c4",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko",
|
||||
"36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko",
|
||||
"36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "regtest"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH",
|
||||
"b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH",
|
||||
"b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "regtest"
|
||||
}
|
||||
],
|
||||
[
|
||||
"1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ",
|
||||
"76a9146d23156cbbdcc82a5a47eee4c2c7c583c18b6bf488ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy",
|
||||
"a914fcc5460dd6e2487c7d75b1963625da0e8f4c597587",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"n3ZddxzLvAY9o7184TB4c6FJasAybsw4HZ",
|
||||
"76a914f1d470f9b02370fdec2e6b708b08ac431bf7a5f788ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n",
|
||||
"a914c579342c2c4c9220205e2cdc285617040c924a0a87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5K494XZwps2bGyeL71pWid4noiSNA2cfCibrvRWqcHSptoFn7rc",
|
||||
"a326b95ebae30164217d7a7f57d72ab2b54e3be64928a19da0210b9568d4015e",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi",
|
||||
"7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"93DVKyFYwSN6wEo3E2fCrFPUp17FtrtNi2Lf7n4G3garFb16CRj",
|
||||
"d6bca256b5abc5602ec2e1c121a08b0da2556587430bcf7e1898af2224885203",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cTDVKtMGVYWTHCb1AFjmVbEbWjvKpKqKgMaR3QJxToMSQAhmCeTN",
|
||||
"a81ca4e8f90181ec4b61b6a7eb998af17b2cb04de8a03b504b9e34c4c61db7d9",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv",
|
||||
"76a9147987ccaa53d02c8873487ef919677cd3db7a691288ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks",
|
||||
"a91463bcc565f9e68ee0189dd5cc67f1b0e5f02f45cb87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"n3LnJXCqbPjghuVs8ph9CYsAe4Sh4j97wk",
|
||||
"76a914ef66444b5b17f14e8fae6e7e19b045a78c54fd7988ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2NB72XtkjpnATMggui83aEtPawyyKvnbX2o",
|
||||
"a914c3e55fceceaa4391ed2a9677f4a4d34eacd021a087",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5KaBW9vNtWNhc3ZEDyNCiXLPdVPHCikRxSBWwV9NrpLLa4LsXi9",
|
||||
"e75d936d56377f432f404aabb406601f892fd49da90eb6ac558a733c93b47252",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"L1axzbSyynNYA8mCAhzxkipKkfHtAXYF4YQnhSKcLV8YXA874fgT",
|
||||
"8248bd0375f2f75d7e274ae544fb920f51784480866b102384190b1addfbaa5c",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"927CnUkUbasYtDwYwVn2j8GdTuACNnKkjZ1rpZd2yBB1CLcnXpo",
|
||||
"44c4f6a096eac5238291a94cc24c01e3b19b8d8cef72874a079e00a242237a52",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cUcfCMRjiQf85YMzzQEk9d1s5A4K7xL5SmBCLrezqXFuTVefyhY7",
|
||||
"d1de707020a9059d6d3abaf85e17967c6555151143db13dbb06db78df0f15c69",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu",
|
||||
"76a914adc1cc2081a27206fae25792f28bbc55b831549d88ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk",
|
||||
"a914188f91a931947eddd7432d6e614387e32b24470987",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"mhaMcBxNh5cqXm4aTQ6EcVbKtfL6LGyK2H",
|
||||
"76a9141694f5bc1a7295b600f40018a618a6ea48eeb49888ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN",
|
||||
"a9143b9b3fd7a50d4f08d1a5b0f62f644fa7115ae2f387",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5HtH6GdcwCJA4ggWEL1B3jzBBUB8HPiBi9SBc5h9i4Wk4PSeApR",
|
||||
"091035445ef105fa1bb125eccfb1882f3fe69592265956ade751fd095033d8d0",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"L2xSYmMeVo3Zek3ZTsv9xUrXVAmrWxJ8Ua4cw8pkfbQhcEFhkXT8",
|
||||
"ab2b4bcdfc91d34dee0ae2a8c6b6668dadaeb3a88b9859743156f462325187af",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"92xFEve1Z9N8Z641KQQS7ByCSb8kGjsDzw6fAmjHN1LZGKQXyMq",
|
||||
"b4204389cef18bbe2b353623cbf93e8678fbc92a475b664ae98ed594e6cf0856",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"92xFEve1Z9N8Z641KQQS7ByCSb8kGjsDzw6fAmjHN1LZGKQXyMq",
|
||||
"b4204389cef18bbe2b353623cbf93e8678fbc92a475b664ae98ed594e6cf0856",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "regtest"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cVM65tdYu1YK37tNoAyGoJTR13VBYFva1vg9FLuPAsJijGvG6NEA",
|
||||
"e7b230133f1b5489843260236b06edca25f66adb1be455fbd38d4010d48faeef",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4",
|
||||
"76a914c4c1b72491ede1eedaca00618407ee0b772cad0d88ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y",
|
||||
"a914f6fe69bcb548a829cce4c57bf6fff8af3a5981f987",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"mizXiucXRCsEriQCHUkCqef9ph9qtPbZZ6",
|
||||
"76a914261f83568a098a8638844bd7aeca039d5f2352c088ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda",
|
||||
"a914e930e1834a4d234702773951d627cce82fbb5d2e87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5KQmDryMNDcisTzRp3zEq9e4awRmJrEVU1j5vFRTKpRNYPqYrMg",
|
||||
"d1fab7ab7385ad26872237f1eb9789aa25cc986bacc695e07ac571d6cdac8bc0",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"L39Fy7AC2Hhj95gh3Yb2AU5YHh1mQSAHgpNixvm27poizcJyLtUi",
|
||||
"b0bbede33ef254e8376aceb1510253fc3550efd0fcf84dcd0c9998b288f166b3",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"91cTVUcgydqyZLgaANpf1fvL55FH53QMm4BsnCADVNYuWuqdVys",
|
||||
"037f4192c630f399d9271e26c575269b1d15be553ea1a7217f0cb8513cef41cb",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cQspfSzsgLeiJGB2u8vrAiWpCU4MxUT6JseWo2SjXy4Qbzn2fwDw",
|
||||
"6251e205e8ad508bab5596bee086ef16cd4b239e0cc0c5d7c4e6035441e7d5de",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r",
|
||||
"76a9145eadaf9bb7121f0f192561a5a62f5e5f5421029288ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3",
|
||||
"a9143f210e7277c899c3a155cc1c90f4106cbddeec6e87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"myoqcgYiehufrsnnkqdqbp69dddVDMopJu",
|
||||
"76a914c8a3c2a09a298592c3e180f02487cd91ba3400b588ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C",
|
||||
"a91499b31df7c9068d1481b596578ddbb4d3bd90baeb87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"5KL6zEaMtPRXZKo1bbMq7JDjjo1bJuQcsgL33je3oY8uSJCR5b4",
|
||||
"c7666842503db6dc6ea061f092cfb9c388448629a6fe868d068c42a488b478ae",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2",
|
||||
"07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"93N87D6uxSBzwXvpokpzg8FFmfQPmvX4xHoWQe3pLdYpbiwT5YV",
|
||||
"ea577acfb5d1d14d3b7b195c321566f12f87d2b77ea3a53f68df7ebf8604a801",
|
||||
{
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"cMxXusSihaX58wpJ3tNuuUcZEQGt6DKJ1wEpxys88FFaQCYjku9h",
|
||||
"0b3b34f0958d8a268193a9814da92c3e8b58b4a4378a542863e34ac289cd830c",
|
||||
{
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true,
|
||||
"chain": "test"
|
||||
}
|
||||
],
|
||||
[
|
||||
"13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE",
|
||||
"76a9141ed467017f043e91ed4c44b4e8dd674db211c4e688ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G",
|
||||
"a9145ece0cadddc415b1980f001785947120acdb36fc87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main"
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4",
|
||||
"0014751e76e8199196d454941c45d1b3a323f1433bd6",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main",
|
||||
"tryCaseFlip": true
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080",
|
||||
"0014751e76e8199196d454941c45d1b3a323f1433bd6",
|
||||
"3MJLKTjYK8U2LSE5G8qH66P6cTkd2fbYKo",
|
||||
"a914d7184dd5b2ac5ffa6b808271b51d39610ca2952187",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "regtest",
|
||||
"tryCaseFlip": true
|
||||
"chain": "main",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
|
||||
"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
|
||||
"mvAUuoN11iBG6xx7AiX3ifUV9WpDfmPa8u",
|
||||
"76a914a0aab571f298b042bc9bce37d8a45f9d37e9c5ef88ac",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test",
|
||||
"tryCaseFlip": true
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx",
|
||||
"5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6",
|
||||
"2MsFPtk8t5LQw7nBpFmsCjf8r9e5vfMMdPX",
|
||||
"a914000844921919a97eca8adb5b63c02ecf7dc212eb87",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main",
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1sw50qa3jx3s",
|
||||
"6002751e",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main",
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj",
|
||||
"5210751e76e8199196d454941c45d1b3a323",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "main",
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
|
||||
"0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
|
||||
{
|
||||
"isPrivkey": false,
|
||||
"chain": "test",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"mjC3aAxQcm6QeeJJ81pnpX61xMMgUXuJUG",
|
||||
"76a914284d017134105d53e712d7801def91cfe6b3b26088ac",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"2N7sKNwAst83ARAqh1z5Ahrt1UieLQZARvc",
|
||||
"a914a0653c424a38b1c7d43ccafb83c90e96da58149c87",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"5J8KazNMuftbk6azCPQb5YhuiQJddSUmJcyYMbSwo8wiUFNcNQJ",
|
||||
"28f3200da1464c7a9d7456f03980471142a63bcf2bd65f87096694a10c20c6ee",
|
||||
{
|
||||
"chain": "main",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"L44JDntsb8mGGLLJXwoEtbYbH1Sf5PZTigvVcA18184sexkwG65w",
|
||||
"cc04f03e141b18f3debe86edf6daaa2f1b84169515774c5489db97b5a2d09153",
|
||||
{
|
||||
"chain": "main",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"93A1NRTKmTeKHinsqaPDLqMnsrhZtdgNJJ4SxEB6n7mGtfxk4Bo",
|
||||
"ced49a2c0d95a062b2da31cc3e04dbad74cf4f93a928c77fd32e8fcca0552926",
|
||||
{
|
||||
"chain": "test",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"cQmrxBnJjdhJFJo98LnNysqDaxUKWBQANYsArzrxsRZhKtaCAqkr",
|
||||
"5f40e71ffb52d0c31786fb6018db39e964c7d5a6b946590461fd7b28e1c4571e",
|
||||
{
|
||||
"chain": "test",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"92kU7nc1yidzKyJdJGDNhNHvjD26KGB2JtTdKK7XyEvm7hWnb1m",
|
||||
"9961f71b7f22fe502330464805548ac3f5391ff013b91d56608ca0d18e5d9e75",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"cSdQEjZBzGGsZT5td11rRJqcbQ3fvz8pVrM6rkKUuJLSUFwPEWTe",
|
||||
"96936c11e60fc08e0fb288776368ad7d754eee11753c39bad4211a5b671c875d",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1qqsjhe0x35lnvcxhf0de0djyqj8gfxwc90g7w8u",
|
||||
"001404257cbcd1a7e6cc1ae97b72f6c88091d0933b05",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvseswlauz7",
|
||||
"0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
|
||||
"bc1qxdyx9mr8hp39mnjdamv5f4m9908nm98zv0tt34pzd0xhrkgnelcqjh32xa",
|
||||
"0020334862ec67b8625dce4deed944d7652bcf3d94e263d6b8d4226bcd71d913cff0",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"chain": "regtest",
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1p2g8z7e58vl5epg9x7en4m5e9x67ekastycnlucc2z2n3ucvmppxqnjtw5m",
|
||||
"5120520e2f668767e990a0a6f6675dd32536bd9b760b2627fe630a12a71e619b084c",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1zyczqag2mv2",
|
||||
"52022604",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1qx3wv854zd2emkzfc83j2t2adzftkdq4kc0t05d",
|
||||
"0014345cc3d2a26ab3bb09383c64a5abad12576682b6",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1qgjr9pkgglh8sw4ksg406xfyl7n2rz5awa5uddeqgn4y96w9khf9s2awvsc",
|
||||
"0020448650d908fdcf0756d0455fa3249ff4d43153aeed38d6e4089d485d38b6ba4b",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1pqhdwj0m7xg6c95vn07qwce4hy5nmhmqvhayx5w8zvf2hye27vruswrc2t7",
|
||||
"512005dae93f7e323582d1937f80ec66b72527bbec0cbf486a38e2625572655e60f9",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1rjfpgh7cnpkqfrq76ekkgucwdqgklltya",
|
||||
"531092428bfb130d809183dacdac8e61cd02",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1qq6dlzfmth08txpj06gm0jj5qaw7j8jj8qlkwdu",
|
||||
"0014069bf1276bbbceb3064fd236f94a80ebbd23ca47",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1q3708vp22qn6ezk47lx2g0ck3tvrm7s0dj7naajlxwegm4289gjlqcwwf29",
|
||||
"00208f9e76054a04f5915abef99487e2d15b07bf41ed97a7decbe67651baa8e544be",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1pdt8nx0wk2xmv0fv0tg9l4ps87nes44dwz8s7yd0xppnxv22k2lcsssg874",
|
||||
"51206acf333dd651b6c7a58f5a0bfa8607f4f30ad5ae11e1e235e6086666295657f1",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1sxs49j3ctsrqpvju8wtszynehlcmgx82hmhs6kckvkyzw24d3r6j29kf3gjmmpmxwx00n7m",
|
||||
"6028342a59470b80c0164b8772e0224f37fe36831d57dde1ab62ccb104e555b11ea4a2d93144b7b0ecce",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"1HYHMSsBJnA3tkACp8Yet1DEfbc63u4ku4",
|
||||
"76a914b56c8ec8a6297b2804113ddabd34fb95c574fca788ac",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"3BiJtoZKF93YdYARkHxDdCYbRzwWuN9Dwa",
|
||||
"a9146defd6f293368f683654fefac42f0fe20add132f87",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"n2FK7HfSTMg8M5A4haEhSr92xUmRFsi5PS",
|
||||
"76a914e3655c6d2ae661c1a2e3a84a8ebb3663d2a5478d88ac",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"2NFiGy8rTrrNKtb7NHoWDpuPtJitNAg2KYr",
|
||||
"a914f6707c684df7be7e37402fb86578b7d31bcff88387",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"mqvNPprrNJxRnN7aopLgcgzfuZFa9pZRNw",
|
||||
"76a914721ef1357a0e3a55920e1cbbafabaa1f675befda88ac",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"2N1hdjsHKpLrbXFh1uFLoP8LF9ykukL8mfz",
|
||||
"a9145cbfa5e24b2a9c85202c1a49d949cd202c9d24b087",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"5JEgGYoTJ9dwkvhM1RBtTYHFCLKHYSsetvuusjT8jBRgxkLHbVw",
|
||||
"376213ede0cff4e5a9a99dc62621849edd12e84e32e50b4c2fd872b2a90a539b",
|
||||
{
|
||||
"chain": "main",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"L4eTMSFgakGfGEv88oZfZTHPicfSpSRLmqkd5xUwM5mRvGdUNWcG",
|
||||
"dd97572e04e485cb3459c25bd5673159e37a5dfce8f6683c03886cf52c766df0",
|
||||
{
|
||||
"chain": "main",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"92Vw1zxCpQeadmn9oo3DcaAzYYATC8E4dxYWcLEpJvmLDGCTpV6",
|
||||
"78605efe8bc054d0ee79eed107446856c3c359add661a5f450e9a34dcfd9c7a0",
|
||||
{
|
||||
"chain": "test",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"cNUakHTv7yJopxUZQ3cM5RC4VfMFkUdCAyQ9jtefhomhpyqpjKiL",
|
||||
"1ab086b845c8776e6f86468b2d7cf782a5b81096274a10b5a21dbf2fbbb20cc6",
|
||||
{
|
||||
"chain": "test",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"92KS5stuYsoRe4PsxD6DTQsL3HL8oicdVwgwKvJTBeLe9JbFsAV",
|
||||
"60899bbfa276d9263c47b92d0f3508acb42810ce00f44de1e8cb0abd628aae13",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isCompressed": false,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"cTz7XPo8zzoemHZVoATACAE9L9jzrdJ8Fkkg7a2ZQ52p9gqAASCL",
|
||||
"bf11771d24fd18daa0a4d9b379cecb9cc7c82177e66f233515351cc05b207007",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isCompressed": true,
|
||||
"isPrivkey": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1q6xw4mq83zgpzyedqtpgh65u7psaarrz768pwsc",
|
||||
"0014d19d5d80f112022265a058517d539e0c3bd18c5e",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1quncjnjmmk4tyxdypl80wqv90lc7qfksp3mcv8lr5zyg9e9y7pv8s09h58f",
|
||||
"0020e4f129cb7bb556433481f9dee030affe3c04da018ef0c3fc7411105c949e0b0f",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1prf34k6kzuf7vugngsz36guj5ykknjt3l36ch5ykdgemuaflfzvhs45h9c3",
|
||||
"51201a635b6ac2e27cce226880a3a4725425ad392e3f8eb17a12cd4677cea7e9132f",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bc1zaxgqtcvx3y",
|
||||
"5202e990",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1q0xeygzklzdcke5fpae8dj4gp7favyg285gy3ez",
|
||||
"001479b2440adf13716cd121ee4ed95501f27ac22147",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1qmrryvv8jl4cdkce3s856whutzrkfcd2lytv3rqwxkj23ktf9fzzqcylgum",
|
||||
"0020d8c64630f2fd70db633181e9a75f8b10ec9c355f22d91181c6b4951b2d254884",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1pv5235wgguf7fu8ajjs0vfpzhgwvwdvxsu88mjrr82cp9esy6467sgt7uws",
|
||||
"512065151a3908e27c9e1fb2941ec484574398e6b0d0e1cfb90c6756025cc09aaebd",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"tb1rzhkfz2she865pjqz2dqa3kv0lvfftkeu",
|
||||
"531015ec912a17c9f540c8025341d8d98ffb",
|
||||
{
|
||||
"chain": "test",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1qp09acyw3823sggs8uyq6yv2vpxe4lq8scuxmef",
|
||||
"00140bcbdc11d13aa3042207e101a2314c09b35f80f0",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1qlnpqh99rp80qn6jkgc0zs7acyc50erwp8eefr3zzkrj7ps739fzqzla273",
|
||||
"0020fcc20b94a309de09ea56461e287bb82628fc8dc13e7291c442b0e5e0c3d12a44",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1p3zd30ugrjyl587qqyu48vqclt3yawauzw6pwt3cpkskvczrytywsjpyxnq",
|
||||
"5120889b17f103913f43f800272a76031f5c49d777827682e5c701b42ccc0864591d",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"bcrt1stgtmagdaa9dqf0rtsxszgcd232g62t43dvkqmmmpf7deqllv576373vc5k9fps08hq3hek",
|
||||
"60285a17bea1bde95a04bc6b81a02461aa8a91a52eb16b2c0def614f9b907feca7b51f4598a58a90c1e7",
|
||||
{
|
||||
"chain": "regtest",
|
||||
"isPrivkey": false,
|
||||
"tryCaseFlip": true
|
||||
}
|
||||
],
|
||||
[
|
||||
"1Au8D5w97THBxXDyjCn5o8UcUWHFgZeoWv",
|
||||
"76a9146c94c780911ea77c43eee9dc7ce4cd5eeab1e2fa88ac",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false
|
||||
}
|
||||
],
|
||||
[
|
||||
"3R2FhhgAE4fM6npLMavoBeedrnDJCN4Ho6",
|
||||
"a914ffee4c4faa197a760f901d25880c56f9d635fc8987",
|
||||
{
|
||||
"chain": "main",
|
||||
"isPrivkey": false
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -12,8 +12,12 @@ from test_framework.util import (
|
||||
)
|
||||
|
||||
BECH32_VALID = 'bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv'
|
||||
BECH32_INVALID_SIZE = 'bcrt1sqqpl9r5c'
|
||||
BECH32_INVALID_PREFIX = 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'
|
||||
BECH32_INVALID_BECH32 = 'bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqdmchcc'
|
||||
BECH32_INVALID_BECH32M = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7k35mrzd'
|
||||
BECH32_INVALID_VERSION = 'bcrt130xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqynjegk'
|
||||
BECH32_INVALID_SIZE = 'bcrt1s0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav25430mtr'
|
||||
BECH32_INVALID_V0_SIZE = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7kqqq5k3my'
|
||||
BECH32_INVALID_PREFIX = 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx'
|
||||
|
||||
BASE58_VALID = 'mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn'
|
||||
BASE58_INVALID_PREFIX = '17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem'
|
||||
@ -40,6 +44,18 @@ class InvalidAddressErrorMessageTest(BitcoinTestFramework):
|
||||
assert not info['isvalid']
|
||||
assert_equal(info['error'], 'Invalid prefix for Bech32 address')
|
||||
|
||||
info = node.validateaddress(BECH32_INVALID_BECH32)
|
||||
assert not info['isvalid']
|
||||
assert_equal(info['error'], 'Version 1+ witness address must use Bech32m checksum')
|
||||
|
||||
info = node.validateaddress(BECH32_INVALID_BECH32M)
|
||||
assert not info['isvalid']
|
||||
assert_equal(info['error'], 'Version 0 witness address must use Bech32 checksum')
|
||||
|
||||
info = node.validateaddress(BECH32_INVALID_V0_SIZE)
|
||||
assert not info['isvalid']
|
||||
assert_equal(info['error'], 'Invalid Bech32 v0 address data size')
|
||||
|
||||
info = node.validateaddress(BECH32_VALID)
|
||||
assert info['isvalid']
|
||||
assert 'error' not in info
|
||||
|
@ -2,10 +2,18 @@
|
||||
# Copyright (c) 2017 Pieter Wuille
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Reference implementation for Bech32 and segwit addresses."""
|
||||
"""Reference implementation for Bech32/Bech32m and segwit addresses."""
|
||||
import unittest
|
||||
from enum import Enum
|
||||
|
||||
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
||||
BECH32_CONST = 1
|
||||
BECH32M_CONST = 0x2bc830a3
|
||||
|
||||
class Encoding(Enum):
|
||||
"""Enumeration type to list the various supported encodings."""
|
||||
BECH32 = 1
|
||||
BECH32M = 2
|
||||
|
||||
|
||||
def bech32_polymod(values):
|
||||
@ -27,38 +35,45 @@ def bech32_hrp_expand(hrp):
|
||||
|
||||
def bech32_verify_checksum(hrp, data):
|
||||
"""Verify a checksum given HRP and converted data characters."""
|
||||
return bech32_polymod(bech32_hrp_expand(hrp) + data) == 1
|
||||
check = bech32_polymod(bech32_hrp_expand(hrp) + data)
|
||||
if check == BECH32_CONST:
|
||||
return Encoding.BECH32
|
||||
elif check == BECH32M_CONST:
|
||||
return Encoding.BECH32M
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def bech32_create_checksum(hrp, data):
|
||||
def bech32_create_checksum(encoding, hrp, data):
|
||||
"""Compute the checksum values given HRP and data."""
|
||||
values = bech32_hrp_expand(hrp) + data
|
||||
polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ 1
|
||||
const = BECH32M_CONST if encoding == Encoding.BECH32M else BECH32_CONST
|
||||
polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ const
|
||||
return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
|
||||
|
||||
|
||||
def bech32_encode(hrp, data):
|
||||
"""Compute a Bech32 string given HRP and data values."""
|
||||
combined = data + bech32_create_checksum(hrp, data)
|
||||
def bech32_encode(encoding, hrp, data):
|
||||
"""Compute a Bech32 or Bech32m string given HRP and data values."""
|
||||
combined = data + bech32_create_checksum(encoding, hrp, data)
|
||||
return hrp + '1' + ''.join([CHARSET[d] for d in combined])
|
||||
|
||||
|
||||
def bech32_decode(bech):
|
||||
"""Validate a Bech32 string, and determine HRP and data."""
|
||||
"""Validate a Bech32/Bech32m string, and determine HRP and data."""
|
||||
if ((any(ord(x) < 33 or ord(x) > 126 for x in bech)) or
|
||||
(bech.lower() != bech and bech.upper() != bech)):
|
||||
return (None, None)
|
||||
return (None, None, None)
|
||||
bech = bech.lower()
|
||||
pos = bech.rfind('1')
|
||||
if pos < 1 or pos + 7 > len(bech) or len(bech) > 90:
|
||||
return (None, None)
|
||||
return (None, None, None)
|
||||
if not all(x in CHARSET for x in bech[pos+1:]):
|
||||
return (None, None)
|
||||
return (None, None, None)
|
||||
hrp = bech[:pos]
|
||||
data = [CHARSET.find(x) for x in bech[pos+1:]]
|
||||
if not bech32_verify_checksum(hrp, data):
|
||||
return (None, None)
|
||||
return (hrp, data[:-6])
|
||||
encoding = bech32_verify_checksum(hrp, data)
|
||||
if encoding is None:
|
||||
return (None, None, None)
|
||||
return (encoding, hrp, data[:-6])
|
||||
|
||||
|
||||
def convertbits(data, frombits, tobits, pad=True):
|
||||
@ -86,7 +101,7 @@ def convertbits(data, frombits, tobits, pad=True):
|
||||
|
||||
def decode_segwit_address(hrp, addr):
|
||||
"""Decode a segwit address."""
|
||||
hrpgot, data = bech32_decode(addr)
|
||||
encoding, hrpgot, data = bech32_decode(addr)
|
||||
if hrpgot != hrp:
|
||||
return (None, None)
|
||||
decoded = convertbits(data[1:], 5, 8, False)
|
||||
@ -96,12 +111,15 @@ def decode_segwit_address(hrp, addr):
|
||||
return (None, None)
|
||||
if data[0] == 0 and len(decoded) != 20 and len(decoded) != 32:
|
||||
return (None, None)
|
||||
if (data[0] == 0 and encoding != Encoding.BECH32) or (data[0] != 0 and encoding != Encoding.BECH32M):
|
||||
return (None, None)
|
||||
return (data[0], decoded)
|
||||
|
||||
|
||||
def encode_segwit_address(hrp, witver, witprog):
|
||||
"""Encode a segwit address."""
|
||||
ret = bech32_encode(hrp, [witver] + convertbits(witprog, 8, 5))
|
||||
encoding = Encoding.BECH32 if witver == 0 else Encoding.BECH32M
|
||||
ret = bech32_encode(encoding, hrp, [witver] + convertbits(witprog, 8, 5))
|
||||
if decode_segwit_address(hrp, ret) == (None, None):
|
||||
return None
|
||||
return ret
|
||||
@ -119,3 +137,5 @@ class TestFrameworkScript(unittest.TestCase):
|
||||
# P2WSH
|
||||
test_python_bech32('bcrt1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3xueyj')
|
||||
test_python_bech32('bcrt1qft5p2uhsdcdc3l2ua4ap5qqfg4pjaqlp250x7us7a8qqhrxrxfsqseac85')
|
||||
# P2TR
|
||||
test_python_bech32('bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqc8gma6')
|
||||
|
@ -138,13 +138,13 @@ class WalletLabelsTest(BitcoinTestFramework):
|
||||
node.createwallet(wallet_name='watch_only', disable_private_keys=True)
|
||||
wallet_watch_only = node.get_wallet_rpc('watch_only')
|
||||
BECH32_VALID = {
|
||||
'✔️_VER15_PROG40': 'bcrt10qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqn2cjv3',
|
||||
'✔️_VER16_PROG03': 'bcrt1sqqqqqjq8pdp',
|
||||
'✔️_VER16_PROB02': 'bcrt1sqqqqqjq8pv',
|
||||
'✔️_VER15_PROG40': 'bcrt10qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxkg7fn',
|
||||
'✔️_VER16_PROG03': 'bcrt1sqqqqq8uhdgr',
|
||||
'✔️_VER16_PROB02': 'bcrt1sqqqq4wstyw',
|
||||
}
|
||||
BECH32_INVALID = {
|
||||
'❌_VER15_PROG41': 'bcrt10qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzc7xyq',
|
||||
'❌_VER16_PROB01': 'bcrt1sqqpl9r5c',
|
||||
'❌_VER15_PROG41': 'bcrt1sqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqajlxj8',
|
||||
'❌_VER16_PROB01': 'bcrt1sqq5r4036',
|
||||
}
|
||||
for l in BECH32_VALID:
|
||||
ad = BECH32_VALID[l]
|
||||
|
Loading…
Reference in New Issue
Block a user