Address-Generation

BIP 32 子密鑰派生在某個索引 (i) 後“停止工作”

  • July 8, 2018

這是我從父 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/00/10/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 個索引的地址,錢包軟體將不會檢查該地址是否收到任何資金。

引用自:https://bitcoin.stackexchange.com/questions/76998