BTC私钥生成的地址会不一样吗?

oxy9LoYX水手发布在 技术讨论
 26902  18

在bitcoin core客户端中获取地址对应的私钥。然后用代码验证,将这个私钥生成的地址和 bitcoin core 中的地址怎么不一样呢?test环境

补充

我在PC上装了Bitcoin Core客户端,切换到测试网,在控制台使用getnewaddress生成一个地址2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT,控制台使用dumpprivkey 2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT 得到的私钥是 cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm。
最后我用私钥cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm去那个PHP程序中测试,发现程序生成的地址与客户端给我的不一样,大佬知道什么原因吗?

  • 正序
  • 最新
只看帖主楼层直达
  • oxy9LoYX 水手 2020-03-19 14:02:45 只看该作者沙发
    没有人回答吗?用的这个脚本验证发现不一样的 https://github.com/Bit-Wasp/bitcoin-php/blob/1.0/examples/addresstypes.php
  • oxy9LoYX 水手 2020-03-19 14:03:30 只看该作者板凳
    求帮忙解惑先谢谢各位大佬!
  • 那不懂了。此处艾特BurntCoins 大神
  • clarenous 队长 2020-03-19 16:06:17 只看该作者5楼
    有可能是地址编码方式不同,楼主可以把两个地址的前4个字母发出来看看
  • M丅P-LWN 船员 2020-03-19 16:10:08 只看该作者6楼
    oxy9LoYX 发表于2020-03-19 14:02:45 没有人回答吗?用的这个脚本验证发现不一样的 https://github.com/Bit-Wasp/bitcoin-php/blob/1.0/examples/addresstypes.php
    qazQAZ123456
    楼层直达
  • M丅P-LWN 船员 2020-03-19 16:13:52 只看该作者7楼
    描述尽量清楚一点
  • lyhistory 副船长 2020-03-19 16:36:55 只看该作者8楼
    首先你要搞清楚生成地址有很多种协议的 晚上下班后我会更新这部分内容到这里 https://lyhistory.com/docs/blockchain/
  • BurntCoins 副船长 2020-03-19 16:50:17 只看该作者9楼
    不太明白你是啥情况。你是在用测试网么?

    我也不懂PHP,不过我看了一下,这是个示例代码对吧。

    你是在用测试网(testnet)模式对吧?
    那应该切换到测试网。

    先引用Bitcoin和NetworkFactory两个库:
    use BitWasp\Bitcoin\Bitcoin;
    use BitWasp\Bitcoin\Network\NetworkFactory;
    然后切换到测试网:
    Bitcoin::setNetwork(NetworkFactory::bitcoinTestnet());

    然后可以看到用来示例的那个WIF私钥(开头是L1U6RC3),把它换成测试网的c开头的WIF私钥,运行程序,就可以输出测试网的地址了。

    Bitcoin Core会用一个私钥生成三种地址,1开头的P2PKH,3开头的P2SH-P2WPKH,bc1开头的P2WPKH。
    这个示例程序没有输出3开头的P2SH-P2WPKH,只输出了P2SH-P2WSH地址(这种地址貌似很少有人用)。你把代码照葫芦画瓢改一下,就能输出3开头的P2SH-P2WPKH地址了。
  • BurntCoins 副船长 2020-03-19 16:51:48 只看该作者10楼
    P2SH和P2SH-P2WSH这两种地址都是3开头,但是它们很显然都不是P2SH-P2WPKH,所以肯定是不一样的。
  • oxy9LoYX 水手 2020-03-19 17:29:44 只看该作者11楼
    BurntCoins 发表于2020-03-19 16:50:17 不太明白你是啥情况。你是在用测试网么?

    我也不懂PHP,不过我看了一下,这是个示例代码对吧。

    你是在用测试网(testnet)模式对吧?
    那应该切换到测试网。

    先引用Bitcoin和NetworkFactory两个库:
    use BitWasp\Bitcoin\Bitcoin;
    use BitWasp\Bitcoin\Network\NetworkFactory;
    然后切换到测试网:
    Bitcoin::setNetwork(NetworkFactory::bitcoinTestnet());

    然后可以看到用来示例的那个WIF私钥(开头是L1U6RC3),把它换成测试网的c开头的WIF私钥,运行程序,就可以输出测试网的地址了。

    Bitcoin Core会用一个私钥生成三种地址,1开头的P2PKH,3开头的P2SH-P2WPKH,bc1开头的P2WPKH。
    这个示例程序没有输出3开头的P2SH-P2WPKH,只输出了P2SH-P2WSH地址(这种地址貌似很少有人用)。你把代码照葫芦画瓢改一下,就能输出3开头的P2SH-P2WPKH地址了。
    我在PC上装了个Bitcoin Core客户端,切换到测试网,在控制台使用getnewaddress生成一个地址
    2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT,然后使用dumpprivkey 2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT 得到的私钥是 cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm。
    我拿私钥cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm去那个PHP程序中测试,发现生成的地址与客户端给我的不一样,大佬知道什么原因吗?
    楼层直达
  • BurntCoins 副船长 2020-03-19 17:33:11 只看该作者12楼
    oxy9LoYX 发表于2020-03-19 17:29:44 我在PC上装了个Bitcoin Core客户端,切换到测试网,在控制台使用getnewaddress生成一个地址
    2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT,然后使用dumpprivkey 2MxqFEhCYaBFUdUgX1ZRCxeZzkrZ9vW9VgT 得到的私钥是 cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm。
    我拿私钥cVq9x2jsN3Hx2DsutghuqUxs2XzKjqo3FS6nqaC8xbnruH9QbvPm去那个PHP程序中测试,发现生成的地址与客户端给我的不一样,大佬知道什么原因吗?
    你的Bitcoin Core默认生成的这个2开头的地址,就是测试网模式下的P2SH-P2WPKH地址。
    那个PHP示例程序里没有输出P2SH-P2WPKH地址,你需要照葫芦画瓢改一下,比如在最后加上这两行代码:
    $p2shP2wpkh = new ScriptHashAddress($p2wpkhWP->getScript()->getScriptHash());
    echo " * p2sh|p2wpkh: {$p2shP2wpkh->getAddress()}\n";
    楼层直达
  • oxy9LoYX 水手 2020-03-19 17:37:30 只看该作者13楼
    BurntCoins 发表于2020-03-19 17:33:11 你的Bitcoin Core默认生成的这个2开头的地址,就是测试网模式下的P2SH-P2WPKH地址。
    那个PHP示例程序里没有输出P2SH-P2WPKH地址,你需要照葫芦画瓢改一下,比如在最后加上这两行代码:
    $p2shP2wpkh = new ScriptHashAddress($p2wpkhWP->getScript()->getScriptHash());
    echo " * p2sh|p2wpkh: {$p2shP2wpkh->getAddress()}\n";
    感谢大佬,原来是这样,终于对了!!!我爱这里热情的大伙儿!
    楼层直达
  • BurntCoins 副船长 2020-03-19 17:48:17 只看该作者14楼
    说实话,我觉得这个示例代码很怪……

    这里的“P2SH”是把P2PKH的输出脚本又拿来封装了一遍(也就是“P2SH-P2PKH”),这样就让人感觉蛋疼,因为这样总共执行了两次HASH160操作,让公钥参与了四遍哈希运算(SHA256->RIPEMD160->SHA256->RIPEMD160)——作为对比,Armory钱包提供的P2SH-P2PK地址就只用了一次HASH160操作(也就是SHA256->RIPEMD160两遍哈希运算)。

    这里的“P2WSH”做法也是类似的(也就是“P2WSH-P2PKH”)。不过因为这里第二次执行的是SHA256而不是HASH160,所以总共只执行三遍哈希运算(SHA256->RIPEMD160->SHA256),相比上面的“P2SH-P2PKH”要少一遍哈希运算,蛋疼程度稍微好一些。

    至于“P2SH-P2WSH”,这个就更蛋疼了,是把上面的“P2WSH-P2PKH”又封装了一遍(这样实际上就是“P2SH-P2WSH-P2PKH”),执行了两次HASH160再加一次SHA256,也就是要执行五遍哈希运算(SHA256->RIPEMD160->SHA256->RIPEMD160->SHA256)……据我所知,虽然隔离见证允许这么做,但是这样实在是太蛋疼了,仅仅是拿来演示“隔离见证支持P2WSH嵌套P2SH”也仍然蛋疼……
  • lyhistory 副船长 2020-03-20 17:02:11 只看该作者15楼


    生成地址有很多协议的,比如

    bip32 bip39 bip44标准

    具体看这里吧,我写的很详细了

    https://lyhistory.com/docs/blockchain/btc_ipayment_integrate.html
  • BurntCoins 副船长 2020-03-21 01:57:31 只看该作者16楼
    lyhistory 发表于2020-03-20 17:02:11


    生成地址有很多协议的,比如

    bip32 bip39 bip44标准

    具体看这里吧,我写的很详细了
    https://lyhistory.com/docs/blockchain/btc_ipayment_integrate.html
    你说的是HD钱包,楼主处理的是单个私钥,还不涉及HD钱包呢。

    1开头的P2PKH传统地址,大小写混合字母+数字,Base58编码,是中本聪设计的,在比特币刚诞生时就有了。

    至于隔离见证地址的生成,BIP141里有提到。

    一大类是bc1开头、全小写字母+数字的,Bech32编码(由BIP173定义),这就是原生隔离见证,交易实际字节数比传统地址稍小,折扣后的虚拟字节数更小,但是老钱包软件不能识别这种新地址(也就是有兼容问题,不过从这种地址发币给老钱包也是没问题的,只是老钱包因为不识别新地址而不能给新地址发币);目前Bech32地址有两种,一种是比较短的P2WPKH,功能和P2PKH类似,由单个私钥控制;另一种是P2WSH,功能和P2SH类似,最常见的用途是闪电网络通道,多重签名当然也可以。

    另一大类是3开头、大小写混合字母+数字,Base58编码,这就是P2SH嵌套隔离见证地址,也就是用P2SH把上面提到的P2WPKH和P2WSH再“封装”一次,这样就可以回避兼容性问题,老钱包软件也能识别,但是交易字节数就更多,好在折扣后的虚拟字节数还是比较小的。
    楼层直达
  • 1
  • 2
登录 账号发表你的看法,还没有账号?立即免费 注册