最近无论是在技术论坛, 还是群分享会, 都在热火朝天地聊着区块链, 那么今天我就自己的理解和大家分享一下什么是区块链
不得不聊的比特币
之所以区块链突然火起来, 是因为比特币在 2017 年年底突然暴涨, 可以看到图中从 11 月份开始到 12 月份的暴涨, 加剧了人们对比特币的认识, 不过也因为投机的人多了, 最近开始跌了
可以点这里看看它值多少钱
比特币其实就是一种流通于网络的虚拟货币区块链是比特币的底层核心技术, 因为对比特币关注增加, 间接导致人们对区块链技术的兴趣探索
接下来我们还是先从比特币源头聊起
从最原始的交易谈起
问: 如果两个陌生人要进行远距离交易, 要怎么保证信任?
答: 通过第三方比如某宝
买家转账给第三方, 卖家发货, 然后第三方付款给卖家
这种需要第三方参与的交易模式成为中心化交易模式
目前大部分的交易都是中心化模式的, 比如银行转账, 证券炒股, 证明这种模式在现实世界确实是目前最优的解决方案, 但是它也有缺点
中心化交易模式的缺点
1. 必须有个可靠的中心如果中心不可靠, 带着钱跑了怎么办?
2. 中心要获取不必要的个人信息来构建信任中心和不认识的甲乙双方也需要构建信任, 这个信任就是你的个人信息(身份证, 手机号等)(而且这一过程也是一种资源的浪费)
3. 受中心的制约你给别人转帐, 可能因为记帐机构放假而延迟几天到帐, 可能因为记帐机构要盈利而付高额手续费, 可能因为记帐机构作弊或系统崩溃而受到损失
那么问题来了
能否实现在不需要第三方的情况下完成交易呢?
有人就提出了一个新方案, 中本聪在 2008 年 11 月 1 日发表了一篇论文比特币白皮书: 一种点对点的电子现金系统, 提出了一种完全通过点对点技术实现的电子现金系统, 它使得在线支付能够直接由一方发起并支付给另外一方, 中间不需要通过任何的金融机构
这时候去中心化借贷模型就出现了举个栗子
A 借了 B 100 块钱, 这个时候, A 在人群中大喊我是 A, 我借给了 B 100 块钱!,B 也在人群中大喊我是 B,A 借给了我 100 块钱!, 此时路人甲乙丙丁都听到了这些消息, 因此所有人都在心中默默记下了 A 借给了 B100 块钱
这个时候一个去中心化的系统就建立起来了, 这个系统中不需要银行, 也不需要借贷协议和收据, 严格来说, 甚至不需要人与人长久的信任关系(比如 B 突然又改口说我不欠 A 钱!, 这个时候人民群众就会站出来说不对, 我的小本本上记录了你某天借了 A100 块钱!)
在上述的模型中, 所谓的 100 块钱已经不重要了换句话说, 任何东西都可以在这个模型中交换, 甚至你可以凭空杜撰一个东西, 只要大家承认, 你就可以让你杜撰的东西流通
比如我在人群中高喊一声我创造了 1w 个腾讯币!, 我甚至不需要知道腾讯币是什么, 也不需要关心世界上是不是真的有腾讯币, 只要大家都听到, 然后在自己的小本本上记下 A 有 1w 个腾讯币, 于是我就真的有 1w 个腾讯币了
从此以后, 我便可以声称我给了某人 xxx 个腾讯币, 只要路人甲乙丙丁都收到并且承认了这一信息, 那我就算完成了这次交易, 哪怕世界上没有腾讯币
没错, 比特币也是这么来的
甲乙丙丁就是网路上的其他结点地址
AB 君就是两个结点地址, 任意两个结点发生交易都会广播给所有结点
甲乙丙丁: 我凭啥给你们记账???
你们可能会问: 凭啥你喊一句话我就帮你记? 我不要面子的吗为了激励大家帮我传话和记账, 我决定给第一个听到我喊话并且记录在小本本上的人一些奖励: 你就凭空得到了 50 腾讯币, 这个是整个系统对你幸苦记账的报酬, 而你记录了这句话之后, 要马上告诉其它人你已经记录好了, 让别人放弃继续记录这句话, 并给你自己的记录编号让别人有据可查, 然后你再把我的话加上你的记录编号一起喊出来, 供下一个人记账 当这个规则定下以后, 这个系统中一定会出现一批人, 他们开始竖着耳朵监听周围发出的声音, 以抢占第一个记账的权利
这个就是比特币去中心化的运作机制, 当全网任意结点发生交易时, 都会有其他结点帮忙记账
争取第一个记账并获得奖励的行为称为挖矿
一般十分钟可以挖出一个区块, 这个区块是 1M 容量大小, 用来记着十分钟里的所有交易(如果没记下来的就延后)
最开始挖矿奖励 50 个
每产生 21 万个区块 (大约每四年) 挖矿奖励减半一次
按上述规则计算, 币总量不超过 2100 万个, 预计 2140 年挖完(这也是比特币保值的原因, 不会有通货膨胀的问题)
最近一次减半在 2016 年 7 月 9 日, 2017 年流通的有 1600 万 +
用于挖矿的设备称为矿机, 运作的人称为矿工
谁都可以说我有一万个腾讯币咯?
假设过了很长一段时间, 我凭空创造的腾讯币已经在这个系统中流通了起来, 大家都开始认可了腾讯币但是这个系统中一共就只有 1W 个腾讯币, 于是有人动了坏心思, 他在人群中高呼我有 1W 个腾讯币! 怎么办? 大家是直接在本本上记下他有 1W 个腾讯币么, 这样不是人人都可以伪造了么?
为了防止这种现象发生, 我决定在我创造腾讯币的时候给我喊的那句我创造了 1W 个腾讯币打上标记, 比如标记为 001), 这样以后在每一笔交易的时候, 我在高喊我给了某某 1 个腾讯币! 的时候, 会附加上额外的一句话: 这 1 个腾讯币的来源是记为 001 的那条记录, 我的这句话标记为 002! 我们再抽象一点, 某人喊话的内容的格式就变成了: 这句话编号 xxx, 上一句话的编号是 yyy, 我给了某某 1 个腾讯币!, 这样就解决了伪造的问题
其实上述模型就变成一个简化的中本聪第一版比特币区块链协议
比特币的诞生
2009 年 1 月 3 日, 中本聪创造了第一个区块创世区块, 里面有 50 比特币并附带了一句话:
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks, 这一句话是当天泰晤士报的头版文章标题, 确认了比特币的诞生时间
甲乙丙丁: 第一个由谁记帐谁说了算?
那你们又要问了, 大家都说自己是第一个记账的怎么办?
于是一种新的规则共识算法产生了
列举两种方法:
工作量证明: 我规定, 只有做对一套五年模拟三年高考试卷的第一名, 才有权利记账
工作量证明机制是算出答案很困难, 但是检验答案很容易的一种机制
比特币使用的是工作量证明, 让每个想要挖矿的计算机结点先去做一道有难度的计算题, 先算出来的有权利记账计算难度大概使得需要花费 10 分钟才能算出来这就是为什么前面说每 10 分钟挖出一个区块
但是工作量证明的毛病是带来不必要的消耗, 因为只有一个人是第一名, 其他人完成的工作量都是徒劳的
因此有人提出了权益证明:
权益证明: 我规定, 持有腾讯币最多且持有天数最多的人, 才有权利记账
这个也有问题, 就是强者越强的问题
工作量证明(Proof-of-Work)
挖矿的人需要求出一个随机值, 使得: SHA256( 随机值 + H( 区块头 ) ) < 某目标值
系统每产生 2,016 个区块, 会动态调整目标值(难度), 使得每产生一个区块需要约十分钟
难度值公式可以想象成:
新难度值 = 旧难度值 * ( 20160 分钟 / 过去 2016 个区块花费时长 )
目标值的计算公式可以想象成:
1. 目标值 = 最大目标值 / 难度值
2. 其中最大目标值为一个恒定值: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值可以想象成: 0x00000000000000000000000000000000000000000000000017268d8a21a
难度的调整是在每个完整节点中独立自动发生的每 2016 个区块, 所有节点都会按统一的公式自动调整难度, 这个公式是由最新 2016 个区块的花费时长与期望时长 (期望时长为 20160 分钟即两周, 是按每 10 分钟一个区块的产生速率计算出的总时长) 比较得出的, 根据实际时长与期望时长的比值, 进行相应调整 (或变难或变易) 也就是说, 如果区块产生的速率比 10 分钟快则增加难度, 比 10 分钟慢则降低难度
我们也可以简单理解成, 比特币工作量证明的过程, 就是通过不停的变换区块头 (即尝试不同的 nouce 值) 作为输入进行 SHA256 哈希运算, 找出一个特定格式哈希值的过程 (即要求有一定数量的前导 0) 而要求的前导 0 的个数越多, 代表难度越大
区块头部结构
区块头里面包含了版本号, 父块的哈希值, 还有 Merkle 根, 还有时间戳, 还有难度值, 还有 nonce(number once, 只有一次的数字, 密码学专用名词)
等等, Merkle 根是什么??
Merkle(默克尔树 or 梅克尔根)
Merkle 是一种二叉树, 在每个区块中有若干交易, 将每个交易做一次 Hash0, 然后每两个交易的 Hash0 再合并 Hash1, 再把两个合并的 Hash1 再合并 Hash2 用上图举例, 就是交易 1 和 2 各自哈希后再合并哈希变成 Hash12, 再和 Hash34 合并哈希变成 Hash1234, 再和 Hash5678 合并哈希变成 Hash1-8
特点:
快速比较大量数据: 当两个默克尔树根相同时, 则意味着所代表的数据必然相同
快速定位修改: 例如上例中, 如果 N4 中数据被修改, 会影响到 N34,N1234 和 Root 因此, 沿着 Root >N1234 >N34, 可以快速定位到发生改变的 D1;
零知识证明: 例如如何证明某个数据 (H1-8) 中包括给定内容 交易 6, 很简单, 构造一个默克尔树, 公布 H1-8,H5678,H56,H6, 交易 6 拥有者可以很容易检测 交易 6 存在, 但不知道其它内容
算力
我们最开始说了比特币这么值钱, 而且谁都可以去挖矿, 那我们是不是现在就可以回家挖矿了呢?
理论上是的, 实际上, 要考虑计算机的算力(计算能力), 前面我们也说了挖矿的难度很大淘宝搜一下挖矿机, 你看到的会是这样的
但是确实有人不干别的, 就挖矿, 有的公司雇人专门维护这些矿机的正常运行这些矿机的电力消耗可能就要几十万
分叉问题
中国上海浦东新区张衡路上的节点和美国纽约曼哈顿第五大道上的节点异口同声喊出来: 我挖到区块了! 里面的交易都是有效的! 奖励归我! 其他节点也几乎同时参与了对这两个区块的校验, 结果发现这俩都没毛病
这已经严重违背了区块链世界里第一大最基本原则所有节点共同维护同一份数据所以, 为了解决这个问题, 区块链世界引入了一条新的规则
拥有最多区块的支链将被认可, 较短的支链将会被直接弃掉
我们大伙都知道挖矿的过程存在巨大的工作量, 并且在计算机的硅基世界里, 不可能出现所谓 同时 的概念, 哪怕纳秒的差别, 那也总是会有先后顺序所以理论上, 分叉的这种僵局很快会在下一个区块被挖掘出来 (以及校验区块) 的时候被打破, 实在不行下下个, 或者下下下个总之机制可以让整个分叉的区块链世界迅速稳定下来
另外, 同一时间, 较短分支上的区块会立即丢弃, 而里面的交易也会随之释放出来, 被重新标记上未确认
双花问题和 51% 攻击
从前, 有一个很有钱也很聪明的人 X-Man, 他说:
我是 X-Man, 我很有钱, 拥有一个强大算力的计算机群
我先从某个区块创造了一条独立的含有多个区块的链条, 然后里面记录着我转给自己 1000 个比特币
这条独立的区块链先不广播给全网然后我找到张三, 给了他 1000 比特币买他 1000 万人民币,
当这笔交易被三次确认后(三个区块被挖出), 张三给了我 1000 万
这个时候我再把我独立的区块链条广播出去, 我的链变成了最长链, 我和张三的交易就被弃掉了, 但是我却拿到了他的 1000 万
这个就是双花问题即利用系统漏洞来使得货币重复花费
X-Man 的想法确实可行, 但是他的计算机群要对抗的是全世界的计算机, 除非 X-Man 拥有全网 51% 的算力, 否则构想不可能实现这就是 51% 攻击, 拥有 51% 算力已经是不太可能的事情了
但即便 X-Man 真拥有全网 51% 的算力, 在真实世界中, 用这 51% 算力做其他事 (比如挖矿或者其他算力服务) 都比攻击比特币系统划算
说了那么多, 区块链到底是什么?
区块链 (Blockchain) 是一种防篡改共享的可追溯的分布式账本数据库技术
防篡改: 单点的修改, 必须通过其他多个节点共识认可后, 才能成功 可追溯: 区块链账本, 只允许写入, 不允许删除 共享: 账本对参与节点透明
为什么叫区块链?
比特币网络里, 每十分钟诞生一个新的区块, 区块里打包了网络里最近十分钟内产生的交易某一个矿工做 Hash 运算获得这个区块的记录权, 同步到其他矿工节点去
每个区块都添加在上一个区块的后面, 形成一条长链条, 所以称为区块链
区块链的技术分类
公有链: 1 无官方组织及管理机构维护 2 所有节点权限一致 3 自由加入和退出
典型应用: 比特币以太坊
(公有链有它的价值, 但是太极端了, 于是产生了稍微弱中心化一点的联盟链)
联盟链: 1 由若干机构联合进行发起和维护 2 节点权限通常是混合型 3 通过授权加入和退出
典型应用: 腾讯区块链(trustSQL)
区块链应用价值举例公益寻人
公益寻人平台众多, 就鹅厂都不止如下:
存在的问题:
同步不及时 重复报案 & 多方撤案 解决方案: 使用区块链让大家共用一个链条, 信息同步快, 一方报案, 多方广播
区块链游戏价值举例以太坊撸猫
最近在币圈, 有一款撸猫的游戏在网络也很火(我们之所以没有感觉到是因为这是个土豪的游戏, 我们玩不起)
如何开始玩: 玩家用 ETH 作为货币来买卖猫, 先去市场上买一只猫先挑便宜的买, 买猫需要手续费(为了防止以太坊区块链拥堵)
买了两只后: 就可以让它俩生小猫每只猫都有 256 个属性, 控制着毛色花纹胡须牙齿等等, 可以理解成 256 种不同的基因两只猫繁殖的时候, 基因以一定的概率遗传基因也会突变, 如果遇到基因突变, 就会生出奇形怪状的小猫
这些小猫由于基因突变, 往往能卖出高价
每次生完小猫后, 父母就会进入 Cooldown 模式, 必须恢复一段时间才能继续繁殖小猫每只猫恢复的时间有长有短, 而且越生得多恢复的时间就越长恢复时间长短也是影响猫价的一个因素
如果只有一只猫, 想跟别人的猫配种, 也可以到市场上看看玩家 1 可以标一个配种价, 玩家 2 如果想配种, 需要支付给玩家 1 这个价格, 生下来的猫归玩家 2 所有基因优秀的猫可以在配种市场上标个高价
配种成功后, 生育也需要一段时间 (几个小时不等) 小猫出生后, 就可以在 My Kitties 页面看到新出生的小猫
每只猫都有 Gen 标识, Gen 0 表示这是创世猫, Gen 1 是第一代, Gen 2 是第二代, 以此类推每隔大约 15 分钟, 会产生一只 Gen 0 的创世猫, 并通过合约自动拍卖, 拍卖所得进入开发商的钱包
区块链撸猫和云撸猫有啥区别?
最大的区别是, 游戏规则确立后, 你的猫永远是你的猫, 开发商无权也无法剥夺任何人的猫而云撸猫是一个中心化的游戏, 所有的猫都登记在开发商的数据库中, 开发商可以随时篡改剥夺任何人的猫, 开发商也可以任意给自己创建高价猫想想看, 在线游戏中的道具不过就是开发商自己创建并拿来出售的数字资产, 没有任何方式可以保证开发商不作弊
Refrences:
区块链是什么, 如何简单易懂地介绍区块链?- 知乎
区块链 (Blockchain) 和比特币 (Bitcoin) 是什么关系?- 知乎
比特币 - 维基百科
分布式一致性与共识算法
揭秘比特币和区块链(一): 什么是区块链?- InfoQ
深度解读区块链撸猫 - 廖雪峰
工作量证明 | Proof Of Work- Bitcoin Developer Guide 中文版
来源: https://juejin.im/post/5a97ea9bf265da23945ee5f8