20181117--深入浅出区块链非对称加密

银行系统
我们先来回顾下现实的银行系统:

首先我们需要把我们的个人信息(如身份证)给银行,银行给我们开立相对应的账户,银行在开户的时候确立了对账户的所有权。
进行支付的时候,银行对交易双方完成转账(银行在开户的时候已经知道我们对应的账户)

匿名账本
那么比特币如何在没有第三方银行的参与下,在确保隐私的同时如何确定账户所有权的呢?

实际上比特币的账户是用地址来表示,账本上不显示个人信息,转账是把比特币从一个地址转移到另一个地址。
转账记录如下:

{
    "付款地址":"2A39CBa2390FDe"
    "收款地址":"AAC9CBa239aFcc"
    "金额":"0.2btc"
}

地址与私钥
比特币的解决方案是,谁拥有某个地址的私钥(如果完全没有加密概念的人,可以简单的把私钥当作密码),谁就能用这个地址进行支付。(所以私钥一定保管好,如果私钥泄漏,比特币就可能丢失)

比特币地址和私钥是一个非对称的关系,私钥经过一系列运算(其中有两次Hash)之后,可以得到地址, 但是无法从地址反推得到私钥。
公钥私钥和地址
你所拥有的代币实际上是放在私钥中的,尽管你的钱包不能用了,但是只有你拥有你的私钥,你也可以在别的地方继续管理你的财产

对交易信息进行签名
实际在签名之前,会先对交易信息进行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

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/84190969