区块链基本原理及其技术实现 - 姜家志 | JTalk 第五期

3,678 阅读22分钟

编者按:本文系比特大陆的姜家志讲师,在掘金技术社区主办的《给开发者的区块链技术指南 | JTalk 掘金线下活动第五期》 活动上的分享整理。掘金 JTalk 目前已举办5期,每期 JTalk 会邀请垂直行业的优秀工程师来分享优秀的实践经验,技巧方法。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。

姜家志,比特大陆哥白尼项目负责人;BCH 社区资深开发者;10年后端技术及互联开发经验,比太钱包Android 和 iOS 客户端的开发者; 从事区块链底层协议的研究,关注高性能、分布式系统的研发。

区块链现在所有的项目都有一个很大的性能问题,需要从技术方面去克服,这是我们团队关注的一个方向,另外整个区块链产业发展很大一部分推动力是来自于密码学。 我们还有一个任务是把密码学上的一些思路和研究,在工程上进行实现。

我是2013年开始接触比特币,最早接触比特币时,我接近两个星期每晚都处于睡不着觉的状态 。我本想着2015、2016年的时候比特币就应该能普及到很多人了,但经历了14、15年的熊市,觉得可能要再延后几年。出乎意料的是,2017年区块链大规模普及。

今天跟大家分享一下区块链的基本原理及技术方面的实现。

1. 区块链是什么?

什么是区块链?

给区块链一个完整定义是很难的,原因有如下两方面:

现在区块链涉及的行业太多,很难给它一个很明确的定义。 区块链基本上每隔一段时间都会发生很大的改变,大家可以在上面作出更多有意思、好玩的东西。

  • 去中心化
    比特币最大的特点是去中心化。
    采用POW,比如早期的比特币、以太坊等都是使用POW,经过长达十年证明之后,POW在去中心化的实现上是最好的证明。
    现在出现POS、DPOS,都是在一定程度上牺牲了去中心化。DPOS采用选举制度,你所投票的人能代表你自己的想法,但并不意味着任何人能够随意的加入网络。
    去中心化有几个很鲜明的特点:
    1. 抗审查能力。 在整个网络活动中,对应到整个区块链里就是所发生的一笔交易,不会因为个人原因就会被拒绝,就是抗审查能力。整个网络里,即使一个矿池拒绝了你的交易,也会有其他矿池帮你打包。
    2. 当某一个网络挂了或某一些不可抗拒原因导致某个节点挂了,不会影响整个网络运转。
      POW、BCH、BTC、以太坊都具有这样的能力,任意一个矿池挂了,其他节点依然正常在运转,如果把所有矿池都挂了,在运行节点中的节点会重新搭建起一个全新的狂吃,这样有可能会出现整个网络处理能力的下降,但网络是不可摧毁的。
      DPOS这种方式肯定会牺牲以上说的两点特性,如果21节点全部被封禁了,恢复就有一定的困难性(备用节点的设计方案还有待确认)。21节点也同样的具有审查交易的能力,任何人想进入这个网络也很困难(需要通过选举)。我称这种方式为弱中心化,毕竟还是有21节点的,不是一个完全的中心化。弱中心化的设计是为了提高性能上一些指标,为了能做更多事情,牺牲了去中心化的特点。
  • 数字化账本
    整个区块链都是运行在互联网上
  • 不可更改
    这个特性在比特币里比较明显,在以太坊里,会出现能更改的可能性。如果一个合约在定义好之后,之后通过交易是可以改变它的状态。但这个可更改性也是之前定义好的,也就是说大家知道你的合约就是这样写的。
  • 确定性的复制状态机
    简单来说就是整个网络所有节点能够拿到所有的数据。
  • 可编程性
    在比特币中就有体现。在以太坊上,可编程性被进一步放大,他使用的语言是solidity,它是一种类似于JavaScript的语言。
  • 匿名性
    因为每个地址/账户在整个网络里,不和真实世界中人物对应。但是因为比特币这种交易是链式的结构,如果你知道这个币给谁了,反向追踪是可以找到源头。匿名性是如果不带入真实世界里,不和真实身份的进行交易的话,是有一定的匿名性。反之,这种匿名性就会消失。这也是为什么交易所会强制做KYC严格身份认证的原因。

区块链工作原理

  • 公私钥体系
  • 数字签名认可
  • 全网广播
  • 区块记录交易以交易为单位,每个交易会记录在区块链上,不会记录真实结果,这些交易本身会影响结果。
  • 链式结构整个交易、区块都是链式结构,大家一直会往一个方向不断延伸下去,不会出现回路或分叉。
  • 参与者确认有效性在比特币中是矿工确认交易,在EOS中是由超级节点确认交易。

区块链特征

区块链是资产型网络。无论现在看到什么样的区块链项目,都运行着一个资产网络。

  1. 强规则网络有如加密、签名、验证、交易和确认等操作。任何一块不符合规则的话,整个块就会被拒绝。在互联网项目中,出现不一致的情况时,后续是有修复和解决的机会;但是在区块链里,这种可能性非常低。如果出现一个很小Bug,整个网络运行都会出现问题,会对整个网络影响很大。在早期,比特币出现过几次的Bug造成了分叉,全网暂停后重新运行。但现在如果再出现类似Bug,就很严重了,因为当时比特币网络参与人员少,比特币价格低,造成的影响较小。
  2. 弱信任每个节点都有对等的,把整个区块链理解为数据库,每个节点在系统内都有写入的权限 。在对等的前提下,比特币是通过算力来决定谁能写入的更多。如果你有更大资源,能调动更大的算力,写入的概率就会很大。
  3. 信任来自于共识机制,非第三方共识机制包括POW、POS、DPOS和DAG。DAG是一种共识机制,它经过了密码学家的认可。
  4. 去中心化现在很多区块链项目在向弱中心化方向发展,弱中心化的好处也能带来对等信任的关系,这种信任网络可能产生的经济价值会有可能大于以前中心化网络带来的价值。

区块链使用

  • 数字化资产
  • 像比特币,都是对标一种交易系统。转帐。股权。融资。数字版权。游戏。存储。如果存储解决了,上面的版权、游戏都有可能会在里面,包括新的一些应用或新的网络产生新的价值。目前都处在摸索阶段,整个业内也都有人朝这几个方向去做。
    EatBCH,是一个委内瑞拉的项目。目前委内瑞拉法币已经崩溃,委内瑞拉和其他国家关系也不好,再加上国内有封锁,美元很难进入。现在面临很重要的问题是没有法币能做交易,委内瑞拉现在存在严重的饥荒,但黑市中有食物 。 他们国内有一个项目叫EatBCH,就是通过捐赠BCH给他们购买食物。整个比特币是跨国界的,只需要知道他的地址,就可以把比特币直接打给他,省去了中间环节。
    利用BCH 低成本网络的特点,省去手续费,几美元就可以让他们吃很久。这是一种价值网络的转移。这个项目估计让委内瑞拉400、500人受益。非洲也类似的项目。

2. 区块链技术实现

公私钥

我们使用的加密网络、VPN等都是公私钥体系,比特币私钥本质上是随机数,只不过这个随机数很大,有2的256次方个私钥,不可能遍历所有的私钥的。 在一个钱包里生成私钥以后,这个私钥理论上有可能被别人撞到,但实际上不可能,概率非常小。
整个网络采用的是secp256k1算法。中本聪当年设计比特币时,一些加密库的实现里是美国政府认可的,他认为不是特别靠谱。

Hash

Hash是一种散列算法,相当于一个数据的指纹,我们无法从Hash里推算出原始数据是什么,因此可以实现对原始数据进行保护。如果原始数据是一致的话,Hash就是一致。不同的原始数据Hash值冲突的概率很小,基本上可以认为是不一致的。

数字签名

从一个原始数据里算出对应Hash,用私钥进行签名,到了验证方那里他拿到原始数据,签名数据,从原始数据中是可以算出Hash的,拿到Hash和公钥、签名之后把数据一起做验证 。这在互联网里也比较常用,邮件里使用PGP加密也是采用类似方式。在整个区块链里,签名是一个所有权认证方式。在整个区块链里,最重要的东西就是私钥,如果以后大家在使用钱包的时候一定要保证好自己的私钥。但是这面临一个很麻烦的东西,大部分人对公私钥有可能了解的比较少,小额有可能还是放到线上钱包比较好,线上钱包提供方也有很多,比如交易所就是一个很大的在线钱包。
由于私钥是要自己保护的,私钥问题从早期一直存在到现在,即密码无法找回,或者没有备份等。在早期时,有人在比特币上挖矿,电脑上面有5000个、8000个都放着,电脑过了一段以后不用了,所有东西都有可能丢失了。整个比特币网络上是2100万个币,据估算找不到的就有五六百万个。

地址

现在很多区块链项目都在用地址,地址是经过Hash算法算出来的。在没有发送出去币的时候,地址能保证你的公钥不被外界看到,只是拿地址做收币使用,公钥不会暴露在网络上,只有当发送币时才会暴露公钥。这样带来的好处是有一天有人破了算法,能从公钥反推出私钥了 ,如果不暴露公钥,还是无法算出私钥,多了一层保护。

交易

比特币交易分为输入和输出,输入是这个币是那里给你的,输出是你的币要发到那里。每一个交易必须有输入,因为没有输入的话,相当于不知道这个钱是从哪里来的。除了挖矿产生的交易,这个交易是由整个共识规则产生的奖励, 这个交易是没有输入的,这个就是比特币的发行。交易本身有锁定和解锁脚本,网络上并不存地址,只关心锁定脚本,根据锁定条件有对应的解锁条件,两个加在一起才能动用你的币。

脚本运行

脚本运行在一个堆栈上,遇到一个脚本操作符,就会执行对应操作,如果碰到数据,又会把数据要到栈里,最终结果是保证整个栈执行出来是对的, 中间任何一个条件不满足的话,整个交易就无法运行。这是为什么整个比特币的协议, 只关心锁定条件是什么,能否拿出对应解锁条件这些的原因。如果解锁条件能够满足的话,就能动用里面的资产,如果满足不了就不能动用。

UTXO和账户

每个交易都有一个输入和输出,但是每一个输出有可能暂时不用,也可能一年之后用,如果不用,就会存在整个系统中,这种结构就叫做UTXO,这是比特币采用UTXO的概念,UTXO能在整个系统设计上更容易实现去中心化的特点,但是以太坊采用不是UTXO的概念,采用的是我们容易理解的账户概念,相当于你的私钥产生地址,就是你的账户,可以一直用这个账户,所有操作、所有记录都在账户下。
为什么有一个UTXO和账户的概念,这里牵涉到UTXO和账户两个系统带来的一些好处。

  • UTXO无需维护余额,因为不关心你的余额是什么,只关心它的锁定脚本是什么,有没有输入对应的解锁脚本,所以整个系统不用维护一个地址,当使用一个钱包时,显示地址里有多少余额时,都是钱包算出来的,拿到这个地址下面有多少未发生交易,加在一起就是你的余额。
  • 每个UTXO都是独立的数据记录,提升验证交易的速度。
  • UTXO本身不用关心事务问题,只关心锁定脚本和解锁脚本。UTXO能够在实现上、编码上给整个系统带来很大的优化,所以比特币在实现去中心化时就非常容易。 在以太坊里要运行智能合约,相应要让每个账户有独立的存数据和取数据能力,使用UTXO这个概念的话,一个数据存了,不太容易找到他存在哪了。账户体系能解决这个问题,现在每一个账户下面都有一个kv存储,自己可以存任何想存的东西, 这样使用智能合约时更加容易实现。

Block

Block Header包括基本数据,交易列表,交易确认是由矿工把对应交易打到块上,这就是交易的确认,所以Block概念在整个系统中运用也是很广泛的。所有块加在一起形成Blockchain的概念。

3. 比特币

布雷顿森林体系解体之后,美元的购买力下降98%左右。
在津巴布韦发生着我们小时候看课本上的事,推一车钱去买东西,最后把钱扔了,车推走了。津巴布韦现在就处于这个状态,持续通货膨胀,导致法币体系基本崩溃。俄罗斯前几年也出现过货币大面积贬值,一段时间贬值50%左右,还有委内瑞拉。印度去年用新的货币系统替换了旧的货币系统,通过这个事情,GDP都下降了一点 。在整个世界历史上有很多国家正在发生类似这样的事情。

比特币是什么?

  • A Peer-to-Peer Electronic Cash System
  • 2008年11月1日,由Satoshi Nakamoto发表论文
  • 2009年1月3日,创世块诞生 (The Times 03/Jan/2009 Chancellor on brink of second bailout for banks),写了一段讽刺的话,当时英国第二次救助银行系统
  • 2010年之后,Satoshi本人逐渐消失并人间蒸发
  • 总量固定2100万枚
  • 比特币发行(Coinbase)挖矿

数学保护的财富

  • 财产的绝对控制,私钥是唯一的凭据,失去私钥将失去一切。
  • 非对称加密算法,Hash摘要算法。
  • 海量账户,以地址(公钥)登记所有权,数量几乎无限供应。
  • 全球无缝流通,有网络就有比特币。
  • 无伪钞,天然审计。

比特币系统三大特征

  1. 工作量证明POW,体现在算出来这个Hash值要小于给定的那个值,这个目标值就是全网去维护的,如果算力大了,还是这个目标值的话,肯定不能满足10分钟出一个块了,这个时候就要提高目标值,目标值越来越大,需要的算力就越来越多,这也是为什么现在全网算力这么大,比特币还是保持10分钟左右出块。
  2. 链式结构,体现在Block和交易上。
  3. 去中心化系统,没有一个组织能完全封杀掉整个网络或控制整个网络。

挖矿

挖矿也是比特币的一种发行方式,发行交易是Coinbase交易

  • 大量尝试随机数找到符合要求数字的过程。
  • 工作量证明(POW)的体现。
  • 比特币的发行(Coinbase)。
  • 高额收益。
  • 维系比特币的支付功能,打包交易。
  • 大算力保证比特币系统安全。在整个产业链中,付出成本最大的其实是矿工,矿工要有基础建设,要买矿机,成本比较大。

挖矿是利益驱动

  • 解决自生长问题,利益驱动,不依赖道德和感情。
  • 消除比特币安全威胁。
  • 在算力博弈块链的过程中,作恶导致受益下降。
  • 利益绑定,拥有巨大算力的组织,会自发的维护系统安全。
  • 比特币的长久发展更有利于矿工交易。
  • 大算力保证比特币系统安全。挖矿是一个利益绑定,拥有最大的算力组织会自发维护整个系统的安全,比特币长久发展有利于矿工交易,因为矿工在这块投入的成本很高。

挖矿的历史

早期是拿CPU挖矿,因为挖矿的人很少,也很少有人会在上面进行改进;后面有一些新玩家进来之后,发现显卡算力更快,就采用显卡;再后面用上了EPGA,在2012年之后就是ASIC的时代 。

比特币现状

  1. 极具有颠覆性的创新产物,但仍然是处于试验阶段
  2. 币值剧烈波动,还不是稳定结算单位
  3. 缺乏多数商家的支持
  4. 受众人数仍然很小
  5. 系统吞吐能力仍然很小,尚无法支撑全球大规模交易(需要扩容) 比特币极具创新性,目前还处于实验阶段,价格不稳定,现在不是稳定的结算单位。比特币缺少大部分商家支持,而且受众人群少。系统吞吐能力小,无法支撑全球大规模交易,所以需要扩容。比特币扩容历史很艰难,现在分为BCT和BCH。现在不会在扩容问题上继续争吵。

比特币扩容历史

  • 2014年Gavin提出扩容问题
  • Bitcoin XT (20M,太过于激进)
  • 2016年Bitcoin Classic (2M)
  • 2016年香港共识,矿工只运行Core的代码,SW第一次出现
  • 禁止讨论区块扩容,路线图中只有SW没有直接区块扩容
  • Bitcoin Unlimited出现,最高有50%算力支持
  • UASH和UAHF

以太坊

以太坊市值一直在不断地涨。在以太坊上存在扩容问题吗?其实以太坊区块大小一直在不断增加,以太坊随着使用增加,整个网络能处理的交易也不断增加,现在要运行以太坊节点,是必须使用SSD的硬盘的 。
以太坊不断在提高自己GPSLimit。上次以太坊因为加密猫的出现,导致大面积拥堵,这是因为以太坊已经没有办法通过简单的扩容方式解决TPS问题了,所以要采用一些新的技术演进来解决。比特币如果遇到像以太坊一样拥堵问题,无法通过简单技术方案进行解决的话,大概需要到每秒100-500笔交易才会出现。
上图是BTC全节点。以太坊全节点现在运行已经很困难了,比特币全节点只有1万多个,但是以太坊全节点依然有2万多个。以太坊能给很多人提供智能合约,可以在上面做更加有创造力的事情,所以大家才愿意运行以太坊的节点。

4. 以太坊的智能合约

智能合约

  • 1990s年代尼克萨博提出
  • 一个可以自动执行的计算机程序
  • 接收和回应信息,接收和存储价值,向外发送信息和价值
  • 图灵完备的语言

以太坊

  • 智能合约
  • 公共区块链平台
  • 以太币是其代币
  • Ethereum Virtual Machine
  • 点对点的合约
  • Vitalik Buterin 在2013提出
  • 2014年ICO众筹得以发展

EVM

  • 外部账户和合约账户
    • 每个账户有一个持久的KV存储
    • 交易从一个账户发往另一个账户
    • 包含代码代码,就会执行,交易相关的数据作为参数
    • EVM执行交易的过程中,会消耗Gas
    • 堆栈机器stack EVM虚拟机分为外部账户和合约账户,外部账户专门用来转帐 。合约账户包含一些代码,能在每个节点被执行,交易相关数据是它的参数。如果在合约里面运行一个很长的代码, 允许它一直运行的话,会有可能把整个系统资源耗死,所以它有一个Gas的概念,要是想运行东西,就必须付钱,当付的钱消耗完了,这个合约就执行完了, 如果Gas消耗完了就不执行了,有没有结果就不关心了,这样能保证了保证整个系统安全。

Solidity

  • Solidity是以太坊使用的类似JavaScript的高级语言
  • 以编译的方式生成以太坊虚拟机代码
  • 数据的每一个状态都可以永久存储
  • 强调合约或者函数执行的调用方式
  • 一旦出现异常,所有的执行都将被回撤
  • Gas消耗完合约停止
  • Remix无需安装的浏览器编译器

ERC 2.0

  • ICO
  • ERC20是一套标准接口
  • 钱包自动支持代币
  • 把ETH打到对应的合约地址上,自动获得代币 ERC2.0本质是一套对应的接口,适应这个接口,就能完成ICO的过程。好处是把以太坊打到对应ICO合约地址上,就能自动获取代币,这对用户来讲比较简单,所以有人在网上说5分钟教你怎么发token。

CryptoKitties 加密猫

  • ERC721 Token
  • 每一只猫都是一种代币
  • 每一只猫都是独一无二的
  • 每一只猫都有自己的基因 加密猫也是一种代币,加密猫最高成交的价格好像是1亿多,每一个猫都独一无二,因为天然是一种代币,和token一样,它还有自己的基因,这是游戏的玩法了。

5. 如何开始

区块链行业构成

  • 底层协议
  • 矿池制造
  • 矿池
  • 交易所
  • 钱包
  • 媒体 其中底层协议最关键。有一个说法,现在底层协议架构类似于98年的互联网,当时大家做各种网络协议,HTTP协议等很多,现在的区块链其实也是。

技术方向上

• 优秀的编程能力 • Go,C/C• 分布式协议 • 数据库 • 编译器 • 操作系统,内核 • 密码学算法

加入区块链企业是了解和学习区块链的最好方式

早期区块链项目都是以开源为主,很少看到有闭源方式运行的,整个区块链其实是运行在开源社区基础上的,而区块链项目本身又是一个开源的项目,希望区块链项目未来能够给开源社区做更多贡献, 我们做的东西很多也都是开源的 。希望未来在能够形成正向循环,开源社区给区块链行业提供贡献,区块链行业产生更多的区块链项目,区块链项目本身又是开源的,又能给开源社区提供贡献。


以上是《给开发者的区块链技术指南 | JTalk 掘金线下活动第五期》 讲师姜家志的分享,如果你对掘金的 JTalk 线下活动感兴趣,可以关注掘金活动页面的 JTalk 活动报名。掘金 JTalk 目前已举办5期,每月一期的 JTalk 会邀请垂直行业的优秀工程师来分享优秀的实践经验,技巧方法。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。

JTalk 预告

JTalk 第六期即将在杭州举办。

  • 主题:从前端到“后端”
  • 时间:5.20