文章目录
区块链的目的理解加密货币的本质去中心化工作量证明问题附录参考链接对区块链和加密货币做了下简单研究,这里记录下。
区块链的目的
区块链的实质是公共账本,目的是降低交易中的信任成本
公共账本中,如何验证一笔交易是否是交易双方的真实意愿,而非伪造的交易?
电子签名。
电子签名的生成原理
几个要素:
私钥 sksksk公钥 pkpkpk加密函数 SignSignSign验证函数 VerifyVerifyVerify信息本身 MessageMessageMessage签名SignatureSignatureSignature
Sign(Message,sk)=SignatureSign(Message,sk)=SignatureSign(Message,sk)=Signature
为什么要使用私钥和信息本身生成签名?
使用私钥可以保证只有私钥持有人能够生成该签名
使用信息保证了其他人不能把签名简单地复制到另一条信息里,来伪造签名
Verify(Message,Signature,pk)=True/FalseVerify(Message,Signature,pk)=True/FalseVerify(Message,Signature,pk)=True/False
用来验证签名是否是由pkpkpk所对应的sksksk生成的。
由于生成假签名(只能借助VerifyVerifyVerify函数和公钥暴力破解)难度极大,因此如果VerifyVerifyVerify函数返回true,就可以认为该签名是由私钥的拥有者生成的。
如何防止有人在公共账本上使用正确的信息和签名,重复记账?
每笔交易信息中都包含独一无二的id即可。
理解加密货币的本质
Tips
每种加密货币都是一个公共账本
货币的本质是交易的历史
去中心化
公共账本保存在哪里? 添加新交易记录的规则是什么?
公共账本保存在所有用户手里,当一笔交易发生,必须广播给所有用户,并在所有账本中添加记录。
那么问题来了,如何保证所有用户的账本记录的交易是一样的,并且顺序也相同呢? 这是区块链技术的核心问题。中本聪关于比特币的论文解决的就是这个问题,他的解决方案是工作量证明。
比特币的公共账本结构大致如下:
由串起来的区块组成(所以又被称为区块链),每个区块包含了前一块的哈希,多条交易记录,和一个工作量证明。只有计算出工作量证明的人,才能打包区块并向全网广播该区块。
工作量证明
工作量证明是接在一段交易记录后的一个数,记为www。www需要满足以下条件:可以使得交易记录+www这段信息的HashHashHash值的前nnn位值为0。(对于比特币来说,nnn是变化的,以保持平均约10分钟产生一个区块。以太坊约15秒)
工作量证明的特点
计算www所需算力很大,但验证www的正确性很简单。
这就使得如果篡改了交易记录,则需要花费大量的算力去计算新的www
由于每个区块都加入前一块的Hash值,因此更改了任一历史区块,或者互换了两个区块,后续区块的工作量证明均需重新计算。
总结下打包一个区块的流程:
一笔交易发生,并向全网广播了这笔交易
所有节点(俗称“矿工”)开始计算www
某一个节点计算出了www,则打包区块并向全网广播该区块
在比特币协议中,打包成功的节点可以在该区块的末尾添加一笔特殊交易,即给自己的奖励。该笔交易无需签名。因此每打包成功一个区块,系统中的比特币都会增加。
问题
收到不同的区块链广播,选择相信哪个?
选择相信最长的那一个。如果区块链长度相同,则等待新的区块产生,使得其中的某一条链最长。(假设有人想伪造一个区块,则后续区块的工作量证明均需要重新计算,构成一条“伪造链”。除非伪造者拥有超过全网50%的算力,否则“伪造链”的长度迟早被其他矿工计算得到的链超过)
附录
密码哈希函数(比如SHA256)的特点
输入任意长度,输出是固定长度
计算hash值的速度比较快
防碰撞特性
任意两个不同的输入值 x、yx、yx、y,使得 Hash(x)=Hash(y)Hash(x)= Hash(y)Hash(x)=Hash(y)是困难的。注意这里强调是“困难”的,而非“不可能“的。完全没有哈希碰撞,在理论上不可能
单向性
难以从Hash(x)Hash(x)Hash(x)反推xxx
puzzlefriendly
无法从输入数据,判断输出到底是什么样子。这意味着你无法通过控制输入值x来获得想要的输出值H(x)H(x)H(x),比如无法预先判断哪些输入会使得一个hash值前K位是0。
参考链接
/video/BV11x411i72w?spm_id_from=333.999.0.0
/p/139310385