- 第 1 章 区块链
- 第 2 章 以太坊
- 第 3 章 以太坊私链入门
- 第 4 章 以太坊网络
- 第 5 章 geth v1.8.16 命令详解
- 第 6 章 Wallet
- 第 7 章 Token
- 第 8 章 智能合约语言 Solidity v0.5.0
- 第 9 章 Truffle v4.1.8 开发框架
- 第 10 章 web3.js - 1.0.0
- 第 11 章 web3j v3.4.0 - Jave Client
- 11.2. 启动以太坊
- 11.3. Maven pom.xml 文件
- 11.4. Java 与 Solidity 数据类型映射关系
- 11.5. 常量
- 11.6. 连接到服务器获取版本号
- 11.7. 获得以太坊状态信息
- 11.8. 单位转换
- 11.9. 账号管理
- 11.10. Credentials
- 11.11. 交易
- 11.12. 钱包
- 11.13. 智能合约
- 11.14. ERC20合约
- 11.15. Infura
- 11.16. 助记词
- 11.17. 过滤器 (Filter)
- 11.18. Subscription
- 11.19. 解锁账号
- 11.20. IBAN (International Bank Account Number)
- 11.21. Springboot with Ethereum (web3j)
- 第 12 章 web3.py - A python interface for interacting with the Ethereum blockchain and ecosystem.
- 第 14 章 Ethereum Developer APIs
- 第 15 章 infura
- 第 16 章 以太坊案例
- 第 17 章 FAQ
- 17.3. Error: authentication needed: password or unlock
- 17.4. 新增节点后不生效
- 17.5. Unhandled rejection Error: Returned error: The method personal_unlockAccount does not exist/is not available
- 17.6. Error: exceeds block gas limit
- 17.7. Migrations.sol:11:3: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(…) { … }" instead.
- 17.8. Exception in thread "main" rx.exceptions.OnErrorNotImplementedException: Invalid response received: okhttp3.internal.http.RealResponseBody@6c25e6c4
- 17.9. 旧版本 Remix(browser-solidity) 本地安装
- 第 18 章 Hyperledger Fabric v2.0.0
- 第 19 章 Hyperledger Fabric 运维
- 第 20 章 Chaincode 链码(智能合约)
- 第 21 章 Hyperledger Fabric Client SDK for Node.js
- 第 22 章 fabric-sdk-java
- 第 24 章 已知 Hyperledger 落地案例
- 第 25 章 Fabric Command
- 第 26 章 Fabric FAQ
- 第 27 章 IPFS(InterPlanetary File System,星际文件系统)
- 第 28 章 IPFS 命令
- 第 29 章 IPFS WebUI
- 第 30 章 IPFS 集群配置
- 第 31 章 IPFS API
- 第 32 章 IPFS Faq
- 第 33 章 EOS
- 第 34 章 EOS 安装
- 第 35 章 CLEOS
- 第 36 章 智能合约开发
- 第 37 章 EOS Dapp 开发
- 第 38 章 FAQ
- 第 39 章 BaaS (Blockchain as a Service) 平台
- 第 40 章 BitCoin
- 第 41 章 其他区块链相关
- 附录 1. 附录
1.10. 理解分布式记账
1.10. 理解分布式记账
首先说明区块链中提到的账本与记账等等词汇是与会计无关的词汇。
我们传统理解的账本是指二位表格,记录某年某月产生的费用。
时间 | 用途| 金额 -----------+-----+----- 2018-05-02 | 借 | 500 2018-05-10 | 还 | 500 2018-05-15 | 借 | 500 2018-05-20 | 借 | 500
如果账目比较多,可以拆账,将不同分类的账目,放到特定账本中。另外二位表格可以通过时间索引或者分类索引等等,快速找到一笔账目。
区块链是怎么记账的?
+----------------+ +----------------+ +----------------+ +----------------+ | blockNumber 0 | | blockNumber 1 | | blockNumber 2 | | blockNumber 3 | | hash: 0x1 |<--- | hash: 0x2 | <---| hash: 0x3 | <---| hash: 0x4 | | parent:0x0 | | parent:0x1 | | parent:0x2 | | parent:0x3 | +----------------+ +----------------+ +----------------+ +----------------+ |时间:2018-05-02 | |时间:2018-05-10 | |时间:2018-05-15 | |时间:2018-05-20 | |用途:借 | |用途:借 | |用途:借 | |用途:借 | |金额:500 | |金额:500 | |金额:500 | |金额:500 | +----------------+ +----------------+ +----------------+ +----------------+
区块链可以理解为是传统账本的行列矩阵做这转换,每个事件收尾相连指向上一个区块地址形成链状,区块链不能通过分类拆分账本,所有账目全部在一个链条上。
什么是分布式记账?上面链状的数据结构将保存在所有的区块链节点上,形成分布式集群,这就是分布式记账。
虽然区块链解决了分布式记账,但是也有很多弊端。我说过互联网上很多关于区块的文章都是臆想,纸上谈兵,他们根本没有实操经验。
下面我们讲讲区块链账本存在的问题
区块链不能键索引,无法快速搜索区块中的数据,必须依赖区块链以外的中心化技术,例如搜索引擎,数据库。例如 etherscan.io 就是将以太坊上的区块重新入库,借助数据库实现数据检索。
区块链只能顺序检索,中心化账本我们汇总账目只需做 sum 求和操作,而区块链必须从 blockNumber 0 开始一次向后读取,运算成本极高。
所有账目均在一个链上,不同分类混在一起,彼此相连。
+----------------+ +----------------+ +----------------+ +----------------+ | blockNumber 0 | --> | blockNumber 1 | --> | blockNumber 2 | --> | blockNumber 3 | --> 时间轴 +----------------+ +----------------+ +----------------+ +----------------+ |时间:2018-05-02 | |时间:2018-05-10 | |时间:2018-05-15 | |时间:2018-05-20 | |分类:A | |分类:B | |分类:A | |分类:A | |金额:500 | |金额:500 | |金额:500 | |金额:500 | +----------------+ +----------------+ +----------------+ +----------------+
无法归档
中心化数据库,可以归档一段时间内的数据,归档数据是冷数据,几乎不会再查询,这样一来中心数据库中的数据量减少,剩下的热数据处理起来非常快。我们有很多技术处理归档数据,将归档数据备份到存储介质上的解决方便有很多,也非常成熟。例如压缩,去重复等等,以减少存储成本开销。
而区块链从诞生之日起到今日所有数据必须放在热数据区。任何新增节点都必须从区块0开始同步,并且保持每日同步到最新区块,否则将无法交易。区块一直在膨胀,随时区块链的普及,交易量猛增,总有一天将不堪重负。
例如BTC(比特币) 安装钱包后,需要从92年的0区块开始同步,至少需要一周的时间,并且占用你硬盘203G的空间。
ETH(以太坊)采用 fast 模式也需要200G的磁盘空间同步一周左右。就算采用最新的 light 模式,同步过程中经常出现中断,没有peers节点,断断续续,体验极度不好。
区块链没有事务处理
因为区块链是首尾相连的,只能在尾部添加新区块,区块无法修改,所以区块链无法做事务处理。
Block 0 -> Block 1 -> Block 2 -> Block 3 -> Block 4
试想一下上面的 Block 2 回滚会怎样?如果 Block 2 回滚,Hash 值产生变化,后面所有区块都作废。所以区块链无法实现事务处理。
超级账本(Hyperledger Fabric)记不了帐
Hyperledger Fabric 中文名称叫超级账本,这个翻译坑害了无数人。 Hyperledger Fabric 跟账本没有任何关系。
实际工作中我使用 Hyperledger Fabric 实现了类似以太坊ERC20代币的功能,发行一个代币后将发行金额写入一个总账,然后从总账中项其他账号转账,用户消费后将金额从用户转会总账。
问题来了,因为超级账本没有事务处理,也无法串行执行每一笔操作,当并发执行的时候,账目出现混乱。
区块链无法将一组业务逻辑放到事物中执行。这样在实际的开发中我们只能依赖应用层,只能在应用层上实现事物锁的功能。由于区块存储在多个节点上,共识时间无法预计,不知道 stub.PutState(异步写入)执行完成的具体时间,无法达到100%无误。对于财务数据来不得半点马虎,我还是决定放弃这个功能,专为传统数据库。
所以超级账本记不了
TPS:Transactions Per Second(每秒传输的事物处理个数)
1. 区块链是异步执行,你无法知道什么时候才能完成这笔交易,无法实现瞬间到账。
2. 交易阻塞
蛋疼的 gas 费用
总结:用区块链记账很蛋疼。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论