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