比特币是第一个成功的区块链项目, 研究他对我们了解区块链技术的现状和发展很有帮助. 通过了解比特币的工作原理来了解区块链的底层原理.
比特币网络简介
首先我们看一张网络图, 包括了比特币网络的主要节点, 下面简单介绍一下:
我们先看比特币核心客户端, 包括:
钱包:存放比特币的私钥, 非常非常重要, 如果不慎丢失或者泄露, 相当于丢失了所有比特币, 钱包可以发起交易;
矿工: 验证交易, 并记录到比特币账簿上, 产生区块;
完整区块链: 完整的分布式账本(或成为分布式数据库), 包含所有的用户, 交易信息的数字文件, 比特币网络中每台电脑都维护一份完全相同的账本文件;
网络路由节点: 负责节点间的通信和数据传输;
stratum 服务器和pool服务器主要工作就是把很多矿工集结起来, 公共记录账本, 也可以成为矿池. 加入矿池的挖矿节点成为矿池矿工.
spv钱包, 是轻量化的钱包, 没有存储完整的区块链, 所以不能成为矿工, 只有钱包和路由的功能, spv钱包在交易的时候需要依赖从网络中获取交易验证数据才能完整交易. 因为spv钱包比较轻量化, 使用方便, 所以现在大部人都使用这类钱包.
边缘路由器, 所用是传输区块链数据, 没有钱包和挖矿的功能.
我们大致了解了比特币网络主要节点和节点的功能.
一笔交易
为了直观的了解比特币的交易, 我们以一比交易来解释这个过程.
发起交易
当交易的时候, 你广播一条信息到比特币网络, 这条信息是一条指令, 要求降低你的余额, 降低的余额添加到接受消息者的账户. 比特币网络在收到消息的时候会通过验证消息的合法性, 验证通过后传递到与其相连的节点. 以此类推, 很快这条交易信息会广播到整个比特币网络.
当Alice 向Bog发起转账的时候, 输入是Alice的10比特币, 输出有两笔, 一笔是Alice 向Bob转账2比特币, 另一笔是向自己转账8比特币, 这个输出是找零:
转账的过程是有数学原理保证其安全性的, 事实上, 比特币是一整套系统来保证网络上节点能维护状态一致. 和银行这种中心化交易区别很大, 比特币网络是无数个点共同维护.
有几点不同:
- 银行只会让你知道自己的交易信息, 而比特币网络中你可以知道所有人的所有交易信息.
- 如果你有意外损失, 或者银行卡信息盗刷, 你可以控告银行, 而比特币的网络中所有人都是匿名的, 你不应信任任何人, 一单钱包丢失, 钱包中的比特币也就随之丢失了, 没人可以找回.
比特币网络设计是很NB的, 以至于你不可以在非安全的网络中进行交易. 数学原理保证了比特币网络的安全.
还是以 Alice 向 Bog 转账为例, 比特币通过密码确认发送信息的合法性.
通过密码来解锁账户的余额, 这种密码被称为数字签名. 数字签名是通过数学方法实现对交易信息生成密码.
数字签名和我们平时使用的邮箱密码或者微信密码完全一样, 每条信息需要一个完全不同的数字签名. 请时刻记住, 比特币网络是公开的, 你发送出去的信息很可能他人拦截.
在进行比特币交易之前, 我要需要创建自己的钱包, 钱包中包含私钥, 所以钱包和私钥是一样的, 需要妥善保管. 钱包软件一般都会把私钥和公钥隐藏, 暴露出来的只是比特币地址. 实际上是一个私钥对应一个公钥对应一个比特币地址.这个过程由底层的数学原理保证不可逆.
数组签名是由私钥生成, 公钥验证. 通俗的说, 私钥是真正的密码, 数字签名只是一种中介, 中介可以证明你拥有密码, 但不需要你暴露密码就可以验证密码是否正确. 在比特币网络中, 公钥表现为比特币地址.
消息合法性的证明方法是通过发送消息和私钥生成数字签名, 网络中的节点通过公钥和消息验证数字签名验证你是否真的拥有这些比特币.
因为数字签名是根据消息内容生成的, 这就使得每条消息的数字签名都不同, 消息和数字签名是一一对应的. 这也就意味着如果消息在传输过程中被修改了, 将导致数字签名失效.
账户状态
到目前我们知道了数字签名是用来验证交易消息正确性的. 下面说一下账户的余额是怎么记录的.
事实上, 比特币系统并不记录账户的余额, 在比特币系统中你拥有的比特币是所有未消费的UTXO的集合.
比特币网络中, 每一笔交易都是一个事务, 事务中包含了输入和输出. 把所有的事务串联起来, 就知道一个账户的所有交易和和余额, 也就是UTXO.
这里有一个简单的规则, 一个事务只能消费一次, 并且必须被完全消费. 每一个事务都会引用并验证前一个事务, 使得比特币的所有权像一根链条一样传递.
每次交易的时候从庞大的账本中查找UTXO是很耗时的, 所以比特币钱包会维护所有的UTXO, 并余额的方式显示给用户.
匿名性
如果你通过网络发送和接受比特币, 只会暴露你的公钥(地址). 所有的交易都记录在分布式账本上, 为了避免你的事务被聚合起来研究, 你需要每个地址只使用一次, 如果你不注意, 很可能你的地址会被关联起来, 如一个事务有多个输入的情况, 输入的多个地址认为是同一个人的. 他们被关联在一起. 要小心, 有些研究人员已经开始使用这些关联来研究比特币的用户的行为.
生成新的地址并不会增加暴露信息的风险, 因为生成私钥公钥对是在你的电脑上, 并不需要联网.
挖矿
挖矿的过程就是矿工们验证每笔新的交易并把它们记录在总帐簿上。比特币网络每10分钟就会有一个新的区块被“挖掘”出来(10分钟这个时间是可以自定义的, 所以可以看到不同的区块链技术出块时间都不同),每个区块里包含着从上一个区块产生到目前这段时间内发生的所有交易,这些交易被依次添加到区块链中。旷工挖矿的目标是找到一个使区块头哈希值小于难度目标的nonce。挖矿节点通常需要尝试数十亿甚至数万亿个不同的nonce取值,直到找到一个满足条件的nonce值。
挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与哈希值匹配的一个过程。只要在原始数据末尾增加一个数字, 生成的哈希值就完全不一样了.
I am Satoshi Nakamoto0 => a80a81401765c8eddee25df36728d732...
I am Satoshi Nakamoto1 => f7bc9a6304a4647bb41241a677b5345f...
I am Satoshi Nakamoto2 => ea758a8134b115298a1583ffb80ae629...
I am Satoshi Nakamoto3 => bfa9779618ff072c903d773de30c99bd...
I am Satoshi Nakamoto4 => bce8564de9a83c18c31944a66bde992f...
I am Satoshi Nakamoto5 => eb362c3cf3479be0a97a20163589038e...
I am Satoshi Nakamoto6 => 4a2fd48e3be420d0d28e202360cfbaba...
I am Satoshi Nakamoto7 => 790b5a1349a5f2b909bf74d0d166b17a...
I am Satoshi Nakamoto8 => 702c45e5b15aa54b625d68dd947f1597...
I am Satoshi Nakamoto9 => 7007cf7dd40f5e933cd89fff5b791ff0...
哈希值是一种从任何一种数据中创建小的数字“指纹”的方法, 这个指纹可以代表原始数据, 并且占用空间小, 可以通过计算数据的哈希值来验证数据是否被修改. 我们平时下载文件的时候会看到MD5值, SHA值, 都是一种哈希值.
以扔骰子的例子为例, 条件是扔两个骰子, 第一天你要扔一个比12小的, 只要不是两个6就满足条件, 第二天你要扔一个比11小的, 你不能扔6+6和6+5, 第三天你要扔一个比10小的, 你不能扔6+6, 6+5, 5+5, 以此类推, 每一步都会比上一步的条件更苛刻, 满足条件条件的概率更小, 需要的计算量更大.
当一个矿机求得了解, 就会把当前区块发送给临近的节点, 临近阶段会通过一些列的测试去验证新区块, 通过后就会继续在网络中传播, 这确保了有效的区块才会在网络中传播.
我们看到这个计算求解的过程只是重复计算求一个值, 实际上并没有产生有意义的输出,做的是无用功. 怎么能让工作量证明不做无用功是比特币研究的一个问题.
产生的区块都有一个编号, 并引用上一区块的哈希值, 后产生的压在上面, 一层一层的,
著名的比特币交易
https://blockchain.info/zh-cn/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
中本聪挖出的第一个区块和50个比特币, 这50个比特币由于设计原因不会被消费, 一直躺在地址里没有使用.
最大的一笔交易
https://blockchain.info/zh-cn/tx/29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf
地址, 交易比特币达到500,000.00910387 BTC, 发生在 2011-11-16 22:39, 从图上我们知道这些比特币已经消费了.
这张图可以清楚的看到比特币消费的关系, 橙色的节点标识已经消费, 如果愿意可以一直查看到最末端的未消费的UTXO.这里只是展示一部分, 有兴趣的朋友可以通过网页查看.
发送地址: https://blockchain.info/zh-cn/tree/1896386
比特币的优势和特点(语音)
比特币网络提供了一个有效的分布式账本系统, 记录到账本的交易都是合法的. 对比传统的银行, 我们在交易时产生流水, 然后由事后监督或者清算中心来核对这些交易的合法性, 这是集中式的, 需要大量的人力, 算力和存储支持. 但是比特币不需要这些成本, 目前为止, 所有的矿机都是旷工自发捐赠的, 而且所有的节点都是对等的, 所有节点共同监控节点的合法性.
比特币是第一个比较成功的数字货币, 为太多数字货币和分布式系统提供了一个成功的案例.
比特币区块链是去中心化的, 一笔交易一但达成, 就不可撤销. 这就要求我们在交易的时候清楚的知道自己在做什么. 我举两个例子:
1. 因为比特币的地址是就是公钥, 而且可读性很差, 我们在转账的时候一定要仔细核对地址再把比特币发送出去.
2. 不要在客户端执行别人发你的代码, 你很可能会因此泄露隐私信息, 而造成损失.
私钥就是你的全部资产, 如果私钥丢失, 谁也不能找回你的资产了, 目前已经确认丢失的比特币有278万. 从这个角度看比特币是一个通缩货币.
比特币的发展(或者说现存的问题, 如隐私安全等)(语音)
比特币的基本原理已经介绍完了, 网络上有很多介绍的比我好很多, 请大家自行查找, 我任务这次分享最重要的是下面对比特币或者区块链网络发展的思考, 区块链并不是万能的, 只有合适的业务场景才能发挥区块链的最大价值, 而且目前区块链的技术还有缺陷, 需要完善.
软件版本兼容性问题. 由于比特币客户端分散在全球各个角落, 而且随着版本的迭代, 网络中正在运行什么版本的客户端的都有, 这对软件漏洞的及时修复造成了挑战.
比特币的工作量证明算个目前来看做的都是无用功, 怎么把这部分工作转换成有用功, 并且结果也是有效的, 是目前区块链研究的一个问题.
比特币区块链的安全隐私性是暴露的, 传统银行只会让你知道你自己的交易信息; 而比特币系统中所有的交易和都是公开的, 如果知道了你的一笔交易, 就可以知道你的全部交易和资产. 我们可以从比特币网络中查到中本聪的账户中有10W的比特币. 一个解决思路是, 把比特币分散到不同的钱包中, 每次交易使用不同的钱包, 这样就比较难追踪一个人到底有多少资产了.
解决分布式账本存储的存储问题, 2017年的时候账本已经达到150G以上, 而且还会不断增加, 如何有效的存储账本是比特币网络需要考虑的.
密码学(我不太懂), 攻防是博弈的双方, 就像大国之间的军备竞赛. 密码学是比特币网络的基石, 但是也需要不断的提高安全强度来保证网络的安全.
不同链之间资产的转移. 现在的数字货币种类繁多, 但是他们之间是不能共享的, 职能在自己的网络中使用. 如果可以让数字资产可以安全的转换, 会让数字货币的市场更加融合, 价值更大, 流通性更好.
作为全球支付系统,效率远远达不到全球贸易的实际要求。比特币网络每秒目前最多确认7笔交易,对比之下, Visa的网络系统每秒最快可处理10,000笔交易,支付宝的记录是2014光棍节每秒钟80,000笔!
链接诚信, 链接社会, 链接未来. 需要搞定多方, 达成共识才能建立区块链信任, 区块链联盟.
抗量子算法. 现在加拿大的某公司, IBM已经在研究量子计算机, 而且他们肯定会拿比特币网络作攻击演习. 益未雨绸缪.
-
智能合约, 是以太坊提出的概念. 存在以下缺陷.
- 智能合约功能-智能合约无法主动调用外部服务
- 智能合约生机-智能合约里的数据怎么办
- 智能合约与法标准不统一.
合规要求. 比如要支持国密算法, 符合监管要求等.
比特币的基石是区块链技术, 区块链是开源的. 所以区块链在技术层面是没有专利的, 如果有公司说有区块链的专业, 很可能是骗子或者是在应用层面的专利.
后记(图片)
通过阅读本文, 希望你能了解一下几点:
- 了解比特币网络的基本原理. 比特币是区块链技术的第一个成功案例. 这种去中心化的架构有点像共享经济, 杀掉(银行)中介, 用户之间直接交易.
- 比特币系统从启动到现在从来没有宕机, 也没有被黑共 ,而且不需要维护, 足以证明区块链技术的稳定性和安全性.
- 区块链技术的基石是密码学, 从数据的角度证明破解系统的难度有多大.
- 区块链目前还有很多问题需要解决. 包括技术和非技术的.
- 区块链技术并不是一切问题的良药, 具体的应用还需要在实践中不断摸索.
- 区块链技术基础都是开源的, 也正是开源, 才让区块链的社区和技术创新快速发展.
参考
精通比特币 http://zhibimo.com/read/wang-miao/mastering-bitcoin/Preface.html
一个查询比特币区块信息的网站 https://blockchain.info/
比特币相关技术介绍 http://www.imponderablethings.com/