比特币地址为什么不会输错?

比特币地址为什么不会输错?

无主之地 副船长 船龄 9.9年 来源 比巴克
 54790  5
我在进行比特币转账的时候会不会输错比特币地址呢?刚刚接触比特币的小伙伴们肯定有这样的顾虑。比特币地址虽然看起来是一串很长的随机产生的字符串,但却是有特定结构的。如果比特币地址中的某个字符出现错误,那么该错误会被程序检查出来。


比特币地址的结构比特币地址和私钥是由ECDSA椭圆曲线加密算法计算出来的,由ECDSA私钥计算出我们常用的Bitcoin-qt格式比特币地址需要有十个步骤。
  • 第一步,产生ECDSA私钥,如:
  • 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
  • 第二步,计算出ECDSA公钥,
  • 0450863AD64A87AE8A2FE8….82BA6
  • 第三步,对公钥进行SHA256运算
  • 600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
  • 第四步,对第三步结果进行RIPEMD-160运算
  • 010966776006953D5567439E5E39F86A0D273BEE
  • 第五步,在第四步结果上加上版本号
  • 00010966776006953D5567439E5E39F86A0D273BEE
  • 第六步,对第五步结果进行SHA256运算
  • 445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
  • 第七步,对第六步结果进行SHA256运算
  • D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
  • 第八步,提出第七步结果的前四个字节
  • D61967F6
  • 第九步,将第八步的结果加到第五步结果最后面
  • 00010966776006953D5567439E5E39F86A0D273BEED61967F6
  • 第十步,对第九步结果进行Base58编码
  • 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
我们由上面的十个步骤可以看出。第八步中的四个字节是拿出来做checksum检查的。检查一个地址是否有效,我们只需要将第十步的结果做逆运算,去掉最后四个字节得到第四步的结果,然后做两次SHA256运算看看能否重新计算出的结果是否以这四个字节开头就行了。


所以当你输入一个比特币地址的时候,Blockchain这样的在线钱包就会用上面的方法检查这个地址是否正确。当然,我们一般都是粘贴比特币地址,所以出错的可能性就更小了。Checksum也不是100%保证能够查出错误地址的,有人计算过,手工输入比特币地址能逃过检查的概率为三十二万分之一。
比特币地址检查代码为了更好的理解这一过程,下面提供一个用python写的比特币地址的检查程序。

from hashlib import sha256
 
digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
 
def decode_base58(bc, length):
    n = 0
    for char in bc:
        n = n * 58 + digits58.index(char)
    return n.to_bytes(length, 'big')
 
def check_bc(bc):
    bcbytes = decode_base58(bc, 25)
    return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4]
 
if __name__ == '__main__':
    bc = '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'
    assert check_bc(bc)
    assert not check_bc( bc.replace('N', 'P', 1) )
    assert check_bc('1111111111111111111114oLvT2')
    assert check_bc("17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j")

  • 全部
  • 最佳
  • shabbie 水手 船龄 6.4年 2016-04-01 12:03:12
    不是不会输错,而是输错了通不过校验
  • 船龄 2015-11-25 12:24:00
    1/320000的几率输错。。
  • 船龄 2015-11-25 10:20:22
    //@巴比特资讯: 转发微博
  • 船龄 2015-11-24 23:25:00
    #比特币# 比特币地址为什么不会输错?http://t.cn/RZKvfy7
  • BTC 版主 船龄 8.8年 2014-02-05 23:06:46
    并不是所有的比特币地址都具有私钥的,比如Counterparty/XCP团队基于PoB(Poof-of-Burn)机制正在开发的Counterparty项目所使用的比特币地址1CounterpartyXXXXXXXXXXXXXXXUWLpVr就是没有私钥的,而且在我们的有生之年以及我们孙辈孙辈孙孙辈等等的有生之年都是无法计算出其私钥的,所以只要比特币地址的checksum对了,基本上还是可以往此地址发送比特币的,但是发送出去之后就不要想要回来了,因为没有人会知道其私钥。

    如下地址的比特币由于其地址的私钥无人知道,所以没有人能够花费其比特币:

    https://blockchain.info/address/1CounterpartyXXXXXXXXXXXXXXXUWLpVr
登录 账号发表你的看法,还没有账号?立即免费 注册
推荐教程
换一批