本文首发于深刻浅出区块链社区 原文连接:比特币全部权及隐私问题-非对称加密应用原文已更新,请读者前往原文阅读python
比特币系统是如何肯定某个帐户的比特币是属于谁的?谁能够支付这个帐户比特币? 若是你对这个问题还不是很明白,那就一块儿来看看吧。算法
咱们先来回顾下现实的银行系统:json
同时银行会对帐户信息进行保密(这点其实不能保证)。数组
那么比特币如何在没有第三方银行的参与下,在确保隐私的同时如何肯定帐户全部权的呢?安全
实际上比特币的帐户是用地址来表示,帐本上不显示我的信息,转帐是把比特币从一个地址转移到另外一个地址。 转帐记录如这样:学习
{ "付款地址":"2A39CBa2390FDe" "收款地址":"AAC9CBa239aFcc" "金额":"0.2btc" }
接下来问题就变为了 谁有权用某个地址进行付款。区块链
支付和全部权 实际是同一个问题,若是此比特币只有我能够用来支付,那么说明我拥有全部权编码
比特币的解决方案是,谁拥有某个地址的私钥(若是彻底没有加密概念的人,能够简单的把私钥看成密码),谁就能用这个地址进行支付。(因此私钥必定保管好,若是私钥泄漏,比特币就可能丢失)加密
比特币地址和私钥是一个非对称的关系,私钥通过一系列运算(其中有两次Hash)以后,能够获得地址, 可是没法从地址反推获得私钥。code
地址: 2A39CBa2390FDe 私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal))) -> 2A39CBa2390FDe
银行系统银行帐号和密码是彻底独立的,没法互相推导,转出时须要同时验证帐号和密码
仍是上面交易的例子:
{ "付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金额":"0.2btc" }
只有拥有地址2A39CBa2390FDe的私钥才能进行支付。
这个时候问题就变为了,如何证实你拥有某个地址的私钥(在不泄漏私钥的状况下)。
实际在签名以前,会先对交易信息进行Hash运算获得摘要信息,而后对摘要信息进行签名。过程大概是这样: 1.对交易进行hash, 获得一个摘要信息(Hash值)
hash(' {"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金额":"0.2btc" }') -> 8aDB23CDEA6
2.用私钥对交易摘要进行签名(付款方在安全的环境下进行,以免私钥泄密), 用代码表示大概是这样。
#参数1为交易摘要 #参数2为私钥 #返回签名信息 sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
在签名运算以后,付款节点就开始在全网进行广播:我支付了0.2btc到AAC9CBa239aFcc,签名信息是3cdferdadgadg,大家来确认一下吧。
广播过程其实是发信息到相连的其它节点,其它节点在验证经过后再转发到与之相连的节点,这样的扩散过程。
广播的信息包含了交易原始信息和签名信息
其它节点在收到广播信息以后,会验证签名信息是否是付款方用私钥对交易原始信息签名产生的,若是验证经过说明确实是付款方本人发出的交易,说明交易有效,才会记录到帐本中去。 (实际还会验证付款帐号有没有足够的余额,咱们暂时忽略这点) 验证过程实际是签名过程的逆运算,用代码表示大概过程是这样的:
#参数1为签名信息 #参数2为付款方地址 #返回交易摘要 verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
若是验证输出的信息和原始交易信息的hash一致,则验证经过,记录帐本,用代码表示大概是这样:
if(verify("3cdferdadgadg", "2A39CBa2390FDe") == hash('{"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金额":"0.2btc"}')) : # 写入帐本 # 广播 else: # donothing
你们能够理解为付款地址为公钥,签名过程即为用私钥对交易摘要的加密过程,验证过程为用公钥解密的过程(为方便你们理解,严格来说是不许确的)。
上面为了更好的理解,我对一些信息进行了简化。
比特币系统使用了椭圆曲线签名算法,算法的私钥由32个字节随机数组成,经过私钥能够计算出公钥,公钥通过一序列哈希算法和编码算法获得比特币地址,地址也能够理解为公钥的摘要。
☛ 深刻浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。
☛ 个人知识星球为各位解答区块链技术问题,欢迎加入讨论。
☛ 关注公众号“深刻浅出区块链技术”第一时间获取区块链技术信息。