Address-Generation
BIP 32 子密鑰派生在某個索引 (i) 後“停止工作”
這是我從父 HD 密鑰獲取子公鑰的程式碼。我改編自Freedomnode:
public function address_from_master_pub($path = '0/0') { if ($this->xpub === NULL && $this->ypub === NULL && $this->zpub === NULL) { throw new Exception("XPUB, YPUB or ZPUB key is not present!"); } $adapter = Bitcoin::getEcAdapter(); $slip132 = new Slip132(new KeyToScriptHelper($adapter)); $registry_classname = 'BitWasp\\Bitcoin\\Network\\Slip132\\'.$this->network_name.'Registry'; $bitcoin_prefixes = new $registry_classname(); if ($this->xpub !== NULL) { $pubPrefix = $slip132->p2pkh($bitcoin_prefixes); $pub = $this->xpub; } else if ($this->ypub !== NULL) { $pubPrefix = $slip132->p2shP2wpkh($bitcoin_prefixes); $pub = $this->ypub; } else if ($this->zpub !== NULL) { $pubPrefix = $slip132->p2wpkh($bitcoin_prefixes); $pub = $this->zpub; } $config = new GlobalPrefixConfig([ new NetworkConfig($this->network, [ $pubPrefix, ]) ]); $serializer = new Base58ExtendedKeySerializer( new ExtendedKeySerializer($adapter, $config) ); $key = $serializer->parse($this->network, $pub); $child_key = $key->derivePath($path); return $child_key->getAddress(new AddressCreator())->getAddress(); }
如果我將它用於索引 0 或 1 或 2(路徑
0/0
、0/1
、0/2
),它可以正常工作,因為如果我將比特幣發送到該地址,我可以在 blockchain.com 上的父級下看到公共區塊鏈上的交易xpub
,它顯示資金。另外,我生成的子地址與 Mycelium HD 帳戶接收地址中顯示的相匹配。但是當我使用索引 243 時(因此創建它的路徑
0/243
並沒有出現在接收端(在那個下面xpub
),即使它作為確認交易出現在我的發送端。該路徑0/243
生成了一個有效的比特幣地址,但是它xpub
即使在確認之後,也沒有出現在 blockchain.com 上。涉及的規則是什麼?如果
i
> 一些限制它不再起作用?或者,如果我使用“亂序”索引它不起作用?或者其他的東西,比如菌絲體停止辨識超過某個索引(i
)的子地址,並且真的是在更高級別的新高畫質 xpub 下的funda safa?我使用相同的程式碼生成i
= 0、1、2 和 243 的所有子地址。
Mycelium HD符合BIP 44 。根據 BIP 44 的規定,地址間隙限制為 20。這意味著在未使用地址的 20 個索引之後,錢包預計不會再使用超過該點的地址。因此,如果您將資金發送到與上次使用的地址之間的差距超過 20 個索引的地址,錢包軟體將不會檢查該地址是否收到任何資金。