智能合约入门概念

0x01 区块链和加密货币基础

知识基础 & 中心化账本 & 去中心化分布式账本 & 区块链 & 挖矿 & 安全性分析 & CTF中的BlockChain

0x02 知识基础

非对称密码加密体制

非对称密码加密体制得有公钥(public key/pk)和私钥匙(secret key/sk)两个密钥,公钥是所有人都可以拥有的,私钥只能自己拥有,倘若私钥暴露则全部的安全性直接丢失。可以将消息理解为装有密码信息的箱子,公钥为箱子的锁,私钥为可以打开锁的钥匙

哈希算法【散列函数】

$hash(msg) = hashsum$

0x03 中心化账本

可以假设有一本公开的账本(比如一个网站),全世界所有人都可以在上面记账,账本上记录了所有的交易记录,例如:

Alice付给Bob¥20 Bob付给Charlie¥30 ……

理想状态下这可以理解为简单的支付系统

但是产生了安全问题:

比如说谁都可以写这个账本,该怎么办?
答:进行数字签名技术

有了签名后,但如果同一笔支付记录被攻击人恶意复制粘贴交易,造成许多非法支付存在该怎么办?
答:对支付记录加上ID

如果有人欠钱不还怎么办?
答:无需结算,只需要让每个人在自己余额不足的时候无法交易即可,即交易时必须有本金(这要求账本必须记录从最开始的交易历史,以为只有只有才能知道每个人的实时余额)

0x04 去中心化分布式账本

每个人手中都保存一份账本,当发生交易时,将其广播给所有人,大家听到后,就在自己的账本瞎记下来

去中心化分布式账本核心问题所在:

如何才能让所有人同意这是正确的账本?

Alice支付给Bob10LD,Bob如何让其他人知道并相信这笔交易,好让他以后可以把这10LD支付给其他人?

如果我也听到了广播交易,如何确定所有人都记录了同样的交易,顺序也相同呢?

可以参考比特币论文讨论:https://bitcoin.org/bitcoin.pdf

给出的方案:哪个账本上计算工作量(Computational work)最大,就信任哪个账本(此为加密货币的核心)

工作量证明:

如果有一个人找到一个特殊数字,将其放在交易列表后面,使得这个列表被SHA256加密后的摘要的前三十个bit都是0,由哈希函数的不可逆特性,所以寻找此数字的方法只能是瞎猜硬碰,所以找到此特殊数字的概率为1/2^30,约等于1/1000000000。找到这个数字之后,验证则非常快,即:所有人都可以很容易证明找到这个数字的人做了海量的计算,而无需自己重做等量的计算。这个数字就叫“工作量证明”(Proof of work)

有一个重点是:所有工作量本身就对应了交易列表,如果修改了交易,哪怕只是一个字节,都会完全改变哈希值,所以你得再猜1000000000次获得一个新的工作量证明

0x05 区块链

工作原理:首先把账本分割为“区块(Blocks)”,每个区块包含了一个交易列表,并加上工作量证明。

规定:区块的hashsum头部需要包含60比特的0,且每笔交易都必须付款者签名。

为了给这些区块一个标准的顺序,我们要求区块的标头,要包含前一个区块的哈希值

这样如果有人修改了之前的区块或者互换了两个区块,就会造成之后所有区块的前一块pre hash都需要更改,这就需要重做所有的计算了,也就是找到新的数字。使得hashsum的头部有60比特的0。因此所有的区块都串成了一条链,我们将此账本称呼为区块链。

0x06 挖矿

这个新协议的另一部分内容为我们允许世界上所有人都参与建造区块,所有人都可以听到全世界交易的广播,其中有一部分人会把交易收集成区块,然后做许多的计算工作,找到特殊数字,使得区块的哈希值开头有60比特零。他们一旦找到这个数字,就广播出新发现的区块。

为了奖励区块发现者的所作工作,当他整理出区块时,我们允许他在最上面加上一笔很特殊的交易,让他凭空得到10LD.

此为区块奖励,这并不需要遵守认可交易与否的准则,因为它不是从别人那里得来的,所以无需签名。

这也意味者每一个新区快都会给经济增添新的虚拟货币

对于矿工来说,每一个区块就有点像一个小彩票,大家都在拼命猜数字,直到有一个幸运儿找到一个特殊数字,使得整个区块的hashsum有许多个0,那他就能得到奖励

对于普通用户而言:他们只想用这个系统进行收付款,他们不需要收听所有的交易,而只要收听矿工们广播出的区块,然后更新到自己保存的区块链中即可。(相信最大工作量)

问题:当接受到两条不同的区块链,其中交易信息相冲突时,选择哪一条?

保留最长,也就是包含的工作量最大的那一条,要是长度相同,那么就等待新的区块,使得其中一条更长

因此区块链就是将我们从相信中心权威到相信计算工作量

0x07 安全性分析

尝试欺骗

假设Alice伪造了一个区块,然后只将其发送给Bob而没有发送给其他人,准备欺骗Bob

为做到这一点,Alice必须做到比其他矿工更快找到有限的工作量证明,这虽然概率很小,但假设Alice做到了,但是其他矿工也在一直挖矿,所以之后会有新的区块加入进来,Bob需要在两条链中选择

所以Alice必须继续一直计算下去,并且保证自己的那条假链的长度比全世界其他矿工的那条链要长(因为Bob会信任最长的那条链),意味着Alice必须掌握全球百分之51的算力才能保证自己的那条假链能够起到欺诈作用。

这也警示我们:接收一个新的区块时,并非一定要信任它

0x08 Little Problem

Problem One:

工作量证明计算出的hashsum的头部0的个数如何决定?

实际的比特币协议会定期更换0的个数,好让发现新区快的平均时间控制在10min左右

新型加密货币的区块时间间隔比这要短的多,例如ETH 15Seconds;XRP 3.5Seconds;LTC 2.5Minutes(就好像彩票开奖,吸引不断的矿工加入)

Problem Two:

比特币的数量是不是有限的?

是有限的,每过四年,区块奖励减半,最初是50btc,现在为6.25btc

Problem Three:

矿工是否就没收入了?

并不是,矿工还可以获得交易手续。例如Alice付给Bob 0.42btc,并且留下0.001btc给矿工<Alice的电子签名>作为激励矿工把它加入区块

Problem Four:

什么是区块链?

  • 分布式,去中心化

  • 非关系型

  • 数据库

    • 只能做插入和查询操作,没有管理员
    • 任何人都可以架设服务器,加入区块链网络,成为一个节点
    • 区块链的世界里面,没有中心节点,每个节点都是平等的,每个非轻量级节点都保存着整个数据库,你可以向任何一个节点写入/读取数据,因为所有节点最后都会同步,保证区块链一致

Problem Five:

作为数据库的区块链记录着什么?

  • 上一个区块的hashsum
  • 交易记录
  • 工作量证明
  • ……

Problem Six:

区块链的特性

  • 去中心化安全
  • 可追溯
  • 不可篡改

Problem Seven:

为什么帮人记账?

激励机制:

  1. 记账成功的人(使区块链高度+1)【矿工】,将会获得区块链系统的奖励(凭空生成一定的币)
  2. 同时,你记录下来的交易们中,也会有一部分手续费,也将属于这位矿工

共识机制

比特币使用工作量证明(PoW)来达成共识

但还有其他的共识机制,例如:

POS Proof of Stake 权益证明

POA Proof of Authority 权威证明机制

POI Proof of Importance 重要性证明

PBFT Practical Byzantine Fault Tolerance 实用拜占庭容错

DBFT Delegated BFT 授权拜占庭容错算法

……

PoW的缺点

挖矿照成大量的资源浪费;另外挖矿的激励机制也造成矿池算力的高度集中,背离了当初去中心化设计的初衷;新区快生成较慢。

当节点拥有占全网百分之n的算力时,该节点既有n/100的概率找到Block Hash