我一直在研究 Bit-Wasp/bitcoin-php 库一段时间,但遇到了无法解决的问题。
我有这个作为我的代码:
public function bitcoinWalletFromPublicKey($key, $index) {
$adapter = Bitcoin::getEcAdapter();
if (config('market.btc_network') == "mainnet") {
$btc = NetworkFactory::bitcoin();
$bitcoinPrefixes = new BitcoinRegistry();
} else {
$btc = NetworkFactory::bitcoinTestnet();
$bitcoinPrefixes = new BitcoinTestnetRegistry();
}
$slip132 = new Slip132(new KeyToScriptHelper($adapter));
$pubkeytype=substr($key, 0, 4);
if ($pubkeytype=='xpub' || $pubkeytype =='tpub') $pubPrefix = $slip132->p2pkh($bitcoinPrefixes);
if ($pubkeytype=='ypub') $pubPrefix = $slip132->p2shP2wpkh($bitcoinPrefixes);
if ($pubkeytype=='zpub' || $pubkeytype =='vpub') $pubPrefix = $slip132->p2wpkh($bitcoinPrefixes);
$config = new GlobalPrefixConfig([
new NetworkConfig($btc, [$pubPrefix])
]);
$serializer = new Base58ExtendedKeySerializer(
new ExtendedKeySerializer($adapter, $config)
);
$path = '0/' . $index;
$fkey = $serializer->parse($btc, $key);
$child_key = $fkey->derivePath($path);
#$account0Key = $child_key->derivePath("84'/0'/0'");
#$child_key = $fkey->derivePath("0/1");
//dd($child_key->getAddress(new AddressCreator())->getAddress());
return $child_key->getAddress(new AddressCreator())->getAddress();
}
这段代码有两个问题:
问题 #1 在代码的前几行中,您会看到我使用了一个 If 语句来检查它应该使用哪个网络。在我使用 testnet 网络进行的测试中,我也确信 If / else { # code } 上的代码可以正常工作,并且它正确使用了 NetworkFactory::bitcoinTestnet() 和 new BitcoinTestnetRegistry();
$key 变量代表我的用户从 Electrum 钱包或格式为 (xpub########################/vpub# 的用户的主公钥########################) 或者在我的情况下,因为它在测试网上它使用 tpub############## ########### 格式。但是,它返回一个格式为 bc######### 的地址,这意味着它在 mainnet 网络上传递,它应该在 testnet 网络上。
问题 #2 在我的代码的下部,我使用 $fkey = $serializer->parse($btc, $key); 和 $child_key = $fkey->derivePath($path) 其中 $path = '0/' $index. $index 这里只是随机数。它可以是 0/1 或 0/99 或任何 0/随机数。
这里的问题是与问题 #1 有某种关系,在它生成错误的地址之后,当我尝试使用这个地址进行事务时,我的 rpc 返回一个无效地址错误。正如您所看到的,我有一个注释代码 $account0Key = $child_key->derivePath("84'/0'/0'"); 其中我得到一个错误,它需要一个私钥而不是一个公钥。现在,我担心的是我不希望我正在制作的系统的用户放置他们的私钥,因为这可能会损害他们的钱包。
基本上,我想使用BitWasp的这个库来实现的是,当用户从他们的钱包中输入他们的主公钥时,我的系统将能够生成一个用于 btc 交易的地址。请帮忙。