账号 --> 地址
转账的过程 是把 比特币 从一个地址转到另外一个地址。
{
"付款地址":"2A39CBa2390FDe"
"收款地址":"AAC9CBa239aFcc"
"金额":"0.2btc"
}
密码 --> 私钥
地址: 2A39CBa2390FDe
私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal
Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))
非对称加密技术(交易签名):如何在不泄露私钥的情况下,来证明我们拥有某个地址的私钥
交易进行 hash 得到摘要
用私钥对摘要进行签名
签名过程:
① 先对原始交易记录进行 hash 运算,得到摘要信息
hash('
{"付款地址": "2A39CBa2390FDe",
"收款地址": "AAC9CBa239aFcc",
"金额": "0.2btc"
}') -> 8aDB23CDEA6
② 用摘要信息和私钥 进行签名运算,得到签名信息
#参数1 为 交易摘要
#参数2 为 私钥
#返回签名信息
sign ("8aDB23CDEA6","J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
验证:
#参数1 为签名信息
#参数2 为付款方地址
#返回交易摘要
verify("3cdferdadgadg","2A39CBa2390FDe") -> "8aDB23CDEA6"
if ( verofy ("3cdferdadgadg","2A39CBa2390FDe")
== hash('{"付款地址": "2A39CBa2390FDe",
"收款地址": "AAC9CBa239aFcc",
"金额": "0.2btc"}')) :
# 写入账本
# 广播
else:
# donothing
签名及验证:(付款的地址是公钥,签名的过程是对摘要进行的一个加密的过程)
#参数1 为交易摘要
#参数2 为私钥
#返回签名信息
sign("8aDB23CDEA6","J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
(验证则是一个解密的过程,用付款方地址和签名的信息进行一个解密的过程)
#参数1 为签名信息
#参数2 为付款方地址
#返回交易摘要
verify("3cdferdadgadg","2A39CBa2390FDe") -> "8aDB23CDEA6"
挖矿-工作量证明(记账的过程被称为挖矿) 12.5btc
打包区块
规则:
一段时间内只有一人可以记账成功(一般为10分钟)
通过解决密码学难题(即工作量证明)竞争获得唯一记账权
其他节点复制记账结果
工作量证明:
Hash(上一个 Hash 值,交易记录集) = 456635BCD
Hash(上一个 Hash 值,交易记录集,随机数) = 0000aFD635BCD 若干个0开头的哈希值
交易记录集:
收集广播中还没有被记录账本的交易
交易的有效性验证
添加一笔给自己转账的交易(挖矿奖励 一般为 12.5 BTC)
共识机制
两个节点同时完成工作量证明,使用谁的区块?
无仲裁机构裁决
都说用我的区块
为什么要遵守协议?
节点工作量只有在其他的节点认同其是有效的
累计工作量最大的区块链(会被其他节点认可)
独立
延长最长链