区块链算法

交易记录

交易记录就是这个样子的

{
    "S-wallet-address":"..." #转账源钱包地址
    "D-wallet-address":"..." #转账目的钱包地址
    "count":"1 btc" #金额
}

账本(区块)

账本可以理解为一组交易记录,一个下列结构称之为一个区块

hash值-账本的摘要,序号、记账时间
交易记录1
交易记录2
...
指向下一个区块的指针

账本的验证凭据(数据摘要的计算)

第一个区块

hash(账本) = hash值

后续区块

hash(前一个账本的hash值, 新账本) = 新的hash值
#产生新的一个区块

区块链

区块使用链表连接起来

账本的验证

一个参与交易记录的节点计算出一个新的区块后,会广播给相邻的计算存储节点。在不同计算存储节点核对信息时候,只需要核对最后一个区块的的hash值即可

账户所有权问题

一个计算节点有两个关键的账户凭证,就是钱包地址(公钥)和私钥,

{
    "wallet-address":"asdfghjk"#public-key
    "private-key":"gaiskdjkljgsclahsdjkhasld..."
}

支付过程:一条交易记录

deal = 
{
    "S-wallet-address":"..." #转账源钱包地址
    "D-wallet-address":"..." #转账目的钱包地址
    "count":"1 btc" #金额
}

**对账户进行签名,不能泄露私钥##

signature = sign(hash(deal), private-key) 

验证签名,验证方会获取交易记录和签名

if (hash(deal) == verify(signature, s-address)#s-address就是public-key

说白了这里就是一个非对称加密机制用于签名的应用。钱包地址是公钥、签名过程用的是私钥对交易记录的hash值进行签名,验证方可以获得公钥和签名,从而解出来交易记录的hash值,比对成功即可验证签名方的确是其所声称的账户

记账

记账规则

  • 一段时间内只有一个人或者账户可以记账成功(比特币是10分钟左右)
  • 其他节点复制记账成功的结果
  • 记账有奖励,记账成功一次有奖励(比特币是12.5btc奖励,每四年减半)

如何保证一段时间只有一个记账成功

  • 解决密码学难题(工作量证明)
#真实记账
hash(last_hash, deal, random) == 000..000xxsjadhkasdfgkjadsd
#要求引入随机数,使得对交易记录的hash要满足结果开头为N个0
#备注:这里面的交易记录集,是系统收集的网络上还没有被记账的交易行为,然后验证交易记录的有效性(验证余额和签名),并添加一笔给自己转账的交易(BTC目前转给自己12.5BTC),如果OK的话。自己也会获得12.5BTC。
  • 首先记账成功的就会广播,其他节点复制

共识机制

如果有两个节点同时记账成功怎么办,按照最长链为标准

#chain-A
1->2->3->4A
#chain-B
1->2->3->4B
#一般一个节点收到一个链,收到两个链的则会选择其一,一个为备用。
#不同的节点会在不同的链上继续工作-挖矿。
#先收到下一个记账成功的就达成共识了。
#例如
1->2->3->4B->5B #那么B就获得了记账权
#如果先收到收到了5B,但是没有收到4B,则5B会作为一个孤块留存
原文地址:https://www.cnblogs.com/mutudou/p/13036065.html