https://www.8btc.com/article/117510

本来并没有计划写这篇文章,只是这两天微信里有一篇文章传播的比较厉害,叫:《其实并没有什么比特币,只有UTXO》。其中有这么一句话:HyperLedger 和Ethereum 一开始并没有采用 UTXO,现在前者已经切换回 UTXO,后者打算增加这个选项。很多朋友过来问我有没有这么回事,所以专门写一篇文章来阐述我的观点。

这篇文章给大家造成很大的困扰,是因为大家都知道以太坊和Hyperledger当前都是基于账户模型的,没有任何UXTO的概念。而作者在文章中指出Hyperledger已切换到UTXO,以太坊也在考虑增加,究竟是怎么回事。

首先说Hyperledger fabric,fabric里连代币都没有(比特币里有比特币,以太坊里有以太币),说什么UTXO就没头没脑了。遍查fabric1.0的整个代码,只在chaincode example里找到一些关于UTXO的内容,那只是用chaincode实现对比特币UTXO的一个存储功能,而且只是一个智能合约的示例。

那作者为什么说fabric已经切换到UTXO了呢?遍查网络,的确发现了相关的内容。一篇是ConsenSys的文章,开头第一句话就是:Recently there has been a proposal to have UTXO based architecture as the fabric of the Hyperledger project.(网址:https://medium.com/@ConsenSys/thoughts-on-utxo-by-vitalik-buterin-2bb782c67e53#.sttqvpfqe)。

另一篇是数字资产公司(Digital Asset Holdings)的文章,里面说到:We are also switching from our simplistic notion of accounts and balances to adopt to de facto standard of the Bitcoin UTXO model, lightly modified.(网址:https://digitalasset.com/press/hyperledger-beta-retired.html)

这些似乎印证了作者的观点。但实际不然,因为这两篇文章都是时间比较老(2016年3月份),在那个时间点的确有那样的建议和讨论。并且很显然当前代码里没有任何UTXO,所有的代码和工作模式仍然是账户模型。我们在网络上继续寻找,在Reddit的帖子上找到了关于这方面的讨论:Both Vitalik and ConsenSys do indeed believe that UTXO is unnecessarily complicated to serve as the Hyperledger fabric.

所以结论是:fabric的UTXO只是曾经的一个讨论,目前并没有在fabric 1.0中实现。而且以后如果要增加的话首先得为fabric引进自己的代币。我个人的观点认为,fabric为商用智能合约系统设计,基于账户模型更加合适。

下面我们说以太坊的UTXO。以太坊的确是在考虑引进UTXO,但是此UTXO非彼UTXO。并不是像大家想象的那样,用UTXO来替换现有的账户模型。首先以太坊为智能合约而设计,其账户模型里除了有余额(balance),还有智能合约代码,还有nonce(为防止重放攻击),以及自定义的存储。把这些换成UTXO显然不合适,因为UTXO胜任不了。比特币的UTXO里只有一个简单的属性:余额(balance)。

那么以太坊的UTXO是指什么呢?这就是以太坊的另一个话题了:分片(Sharding)。分片是扩展以太坊、增加TPS的有效方法,目前正在社区里被广泛讨论和研究。目前的以太坊的工作模式是所有节点(比如共16万个)同时验证所有交易,实际上这是极度低效和没有必要的一种模式。为了保证一致性,如果我们按照地址的前4位来分片,可以把所有地址分成16片。这样每个交易只需要其中1万台节点验证便可通过。如果一个交易涉及的账户都在同一片区并没有什么问题,但如果涉及到不同片区问题就来了。

为了解决不同片区之间的交易问题,以太坊设计出了称为收据(receipt)的工作模式。而这个收据的模式和UTXO类似,故而也称为以太坊的UTXO。

既然此UTXO并不是指替换当前账户模型,变成比特币模式的UTXO,那么是不是说明当前账户模型就没有问题呢?也不是!当前账户模型的确存在一些弊端。

以太坊中以太币的转移安全性不如比特币高。下面是一个真实的例子。一个网友请我帮忙,让我帮助从Yobit.net追讨258个ETH。原因是他从Yobit.net转移币到云币网账户时,发生了out of gas错误。云币网给出的目标地址是一个合约地址,而Yobit.net以为是个外部地址,交易设置的gasLimit为21000(这对于合约账户就不够了),因此发生了out of gas的异常。币的转移被取消,但是这个交易(Transaction)却是完成的。

Yobit.net系统以交易成功作为币转移成功的依据,所以出现了问题。而这些问题是在UTXO模型里不会发生的。

所以针对这些问题,以太坊社区为提高转移以太币的安全性,也在考虑设置更加抽象的账户模型,把控制权交给EVM(智能合约层面),这样每个用户可以自定义自己的账户模型。通过智能合约能够实现任意的账户模型,比如UTXO。

这些都还没有发生,但是我相信UTXO也将在未来的以太坊中扮演重要的角色!

更多内容请关注谈谈区块链的微信公众号:ttblockchain。

谈谈区块链(18):以太坊的UTXO的更多相关文章

  1. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系

    不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...

  2. [币严区块链]简单易懂的以太坊(ETH)智能合约开发入门教程

    以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开发应用 ...

  3. 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

    很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...

  4. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  5. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  6. Hyperledger Fabric、Corda和以太坊对比

     Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...

  7. 以太坊、Hyperledger Fabric和Corda,哪个更好?

    原创: Philipp Sandner 区块链前哨 昨天 编译|盖磊编辑|前哨小兵甲区块链前哨导语: 我们分析了 Hyperledger Fabric,R3 Corda 和以太坊这三种分布式账本技术间 ...

  8. bimgotoblock-BIM要上区块链

    比特币(BitCoin)的暴涨暴跌让参与者体验着过山车的感觉,有人一夜暴富.别墅靠海,也有人拍断大腿或者恨不得跳楼了此残生.世人也更多的听说了比特币底层的依托--区块链(BlockChain) 技术. ...

  9. [转帖](区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗?

    (区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗? http://baijiahao.baidu.com/s?id=1600948969290990883&wfr=spide ...

  10. android和java以太坊开发区块链应用使用web3j类库

    如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建.钱包创建.交易转账,交易与状态.智能合约开发与交互.过滤器和 ...

随机推荐

  1. watch 监视搜索关键词的变化不断发送请求返回建议

    watch: { keywords: { // yarn add lodash 下载lodash包 // import { debounce } from "lodash"; 引入 ...

  2. js中数据的基本类型

    有5种基本数据类型分类 : 1. 数字型  number 2. 字符型 string 3. 布尔型 boolean 4. undefined 未定义  就是声明了但是没有赋值 5. null 空指针 ...

  3. 云原生周刊:Artifact Hub 成为 CNCF 孵化项目|2024.9.23

    开源项目推荐 Coroot Coroot 是一个开源监控工具,旨在为云原生应用提供可观察性.它通过整合指标.日志和追踪信息,专注于提供应用性能的洞察. DirectPV DirectPV 是一个开源项 ...

  4. KubeSphere 社区双周报|2024.04.26-05.09

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  5. Solution of CF1842C

    Brief description of the title 若 \(a_i=a_j\) 且 \(1\le i < j\le |a|\).则删除 \(a_{i}\) 到 \(a_j\) 所有数. ...

  6. 我在大厂做 CR——如何体系化防控空指针异常

    大家好,我是木宛哥,今天和大家分享下--代码 CR 时针对恼人的空指针异常(NullPointerException)如何做到体系化去防控: 什么是空指针异常 从内存角度看,对象的实例化需要在堆内存中 ...

  7. MongoDB聚合类操作

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 语法:db.tablename.aggregat ...

  8. Go下载依赖包失败的解决方法

    jenkins构建job,执行go test命令报如下图的timeout错误 从报错信息中可以看出是因为下载依赖包超时 解决方法: go env查看go环境变量 GOSUMDB=sum.golang. ...

  9. Go服务自动触发单元测试覆盖率

    一.用到的工具 Gitlab Jenkins Shell go test 二.实现原理 在gitlab上配置jenkins的webhook,当有代码变更时自动触发jenkins构建job,job内的s ...

  10. CUDA编程学习 (3)——内存和数据定位

    1. CUDA Memories 1.1 GPU 性能如何 所有 thread 都会访问 global memory,以获取输入的矩阵元素 在执行一次浮点加法时,需要进行一次内存访问,每次访问传输 4 ...