请选择 进入手机版 | 继续访问电脑版
交易所网站:BIT.CC | NOVA | 地球币交易所 | LIVECOIN | 推荐币种:EAC地球币,地球人使用地球earthcoin || 地球币Q群: 220205376 / 区块链技术交流Q群:796660050 请对号入群
地球币区块链 极速跨境支付 | 沙坪坝附近求购水电 | 地球币挖矿矿机批发销售 | NXT-EAC | Funcoin.co | CEO.bi | UCOIN | 笔加索 | LiveCoin | 欢迎程序员协助SK加速升级!奖励50%!
查看: 137|回复: 0

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

[复制链接]

385

主题

798

帖子

2356

积分

网站编辑

Rank: 8Rank: 8

积分
2356
发表于 2018-8-28 12:13:36 | 显示全部楼层 |阅读模式
我在进行比特币转账的时候会不会输错比特币地址呢?刚刚接触比特币的小伙伴们肯定有这样的顾虑。比特币地址虽然看起来是一串很长的随机产生的字符串,但却是有特定结构的。如果比特币地址中的某个字符出现错误,那么该错误会被程序检查出来。



比特币地址的结构比特币地址和私钥是由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运算看看能否重新计算出的结果是否以这四个字节开头就行了。

procedure

所以当你输入一个比特币地址的时候,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")

发布者: 无主之地 发表于: 2013-11-9 10:02 原作者: P2PBUCKS来自: 比巴克
打赏地址:ejszkYpEhdrCVAC9rR5PRcZf8vhr3LvZXz 二维码打赏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手里有币,心中不慌,介绍新朋友去购买地球EAC,使用时代APP(bit.cc去下载),购买交易都方便!团结地球人发展地球EAC到地球村!让地球人都使用上地球币! | 地球币斗地主游戏
EAC华人开发Q群488414827 ,欢迎C++,PYTHON,JAVA,安卓工程师,NODEJS等区块链程序员都加入协助Sandokaaan加速升级地球币技术!奖励50%!

特别鸣谢以下单位提供赞助:墙纸 地毯 窗帘 软包 墙布 壁画 | 上海办公室装修 上海办公楼装修 | 广州办公室装修 重庆办公室装修 |
地毯厂 | 壁纸壁布厂 | 上海壁画厂 办公室装修 办公楼装修办公楼装修设计 办公室装修设计 棕墉建筑设计
广告赞助我们: 比特币BTC: 17sKkc4aRSNyNi3FwGKw7Bko7nf7pkM31x | 地球币EAC:ekSJy8AAfxHCN3ukmmwXPtUmMSYhjDkSXQ 更多广告赞助欢迎添加Q群522708000
快速回复 返回顶部 返回列表