对区块链和加密货币做了下简单研究,这里记录下。
区块链的目的
区块链的实质是公共账本,目的是降低交易中的信任成本
-
公共账本中,如何验证一笔交易是否是交易双方的真实意愿,而非伪造的交易? 电子签名。 电子签名的生成原理 几个要素:
- 私钥
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。
参考链接
|