交易记录就是这个样子的
{
"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值,比对成功即可验证签名方的确是其所声称的账户
#真实记账
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会作为一个孤块留存