现在位置:首页 > 包含标签 以太坊 的所有文章
  • imtoken教程:以太坊 2.0 存款合约启用指南

    以太坊是不少的币友在从事币圈以来大部分人用的货币之一,而随着以太坊 2.0 存款合约启用,Eth2 第 0 阶段离我们更近一步。imToken官方也一在强调将持续关注并第一时间支持以太坊 2.0,那么现在就下载使用 imToken 最新版本,和我们一起准备迎接以太坊下一轮热潮。 以太坊 2.0 的存款合约终于部署并启用,这也就意味着以太坊离 2.0 的第 0 阶段只有一步之遥了。只要能吸引超过 1.6 万个验证人参与质押,第 0 阶段网络就会在 12 月 1 日正式上线。 以太坊基金会在博客发表了以太坊 2.0 的数项重要更新,除了公开以太坊 2.0 技术规范的 1.0 正式版之外,还确认了主网的存款合约地址(0x00000000219ab540356cBB839Cbe05303d7705Fa),并确认了以太坊 2.0 的创世时间:区块高度大于 1,606,824,000,也就是 UTC 时间的 12 月 1 日中午 12 点左右(北京时间 12 月 1 日晚上 8 点)。 小技巧:如果记不住像乱码的存款合约地址也没关系,官方还注册了以太坊域名 depositcontract.eth,会直接定位到该合约。该域名被续费到 2150 年,并销毁了该地址的所有权,也就是在此之前将没有人可以更改该域名所定位的具体地址。 但在此之前,还需要能吸引足够的验证人参与,否则网络也不会在最低区块高度上线。根据以太坊 2.0 的设计,只有当 16,384 (2 的 14 次方)个验证人参与,2.0 的信标链才会正式开启。否则的话,将会等到这个下限达成之后的 7 天后才会启动主网。 而每位验证者需要锁定 32 ETH (2 的 5 次方)至质押合约,这也就意味着总共需要质押 524,288 个 ETH,也就是超过 2 亿美元(以 ETH 单价 400 美元计)。 另外验证者也需要同时运行以太坊 1.0 和 2.0 的客户端,可以从 1.0 的客户端中选择四个里面的其中之一,也需要从 2.0 的客户端中选择四个里面的其中一个,以提升网络的去中心化程度。有意思的是,以太坊在网页上推荐这些客户端的顺序也是随机的。 在上线后的短短几小时内,目前已经有 1.4 万多 ETH 存入,而且仍在快速增长中,不过离目标还有不少距离。 什么是以太坊第 0 阶段? 以太坊 2.0 将分为至少 3 个阶段,第 0 阶段先上线「信标链」,作为整个 2.0 网络的随机数生成器。到了之后的第 1 阶段和第 2 阶段,将会逐渐打开分片和智能合约等功能,验证人将会根据信标链的随机分配,去对应的分片提供交易验证服务。 如何成为验证人? 以太坊基金会制作了一整套教程,帮助更多人可以更方便地了解如何成为验证人、风险以及具体的操作步骤。 整个流程分为多步: 概述:主要是给用户了解以太坊 2.0 的背景,以及相应的风险; 客户端:用户需要选择相应的以太坊 1.0 和以太坊 2.0 客户端; 生成私钥:用户需要使用特定工具(eth2.0-deposit-cli)生成私钥,建议离线进行,并做好备份; 上传验证者凭证:上传刚才用工具生成的文件; 以及之后还需要连接钱包,并确认和发送最后的交易。 普通用户不建议参与? 官方表示在教程中多次提出,由于用户可能会遭遇软件 Bug,或因为 Bug 而导致惩罚(Slashing),也需要承担在之后阶段才能转账的风险,并从技术上有能力运行节点。 对于普通用户而言,成为验证者需要承担多方面的风险,所以在考虑成为验证人之前建议仔细阅读官方文档 。 单向车票? 目前以太坊 1.0 的 ETH 进入 2.0 存款合约的过程是单向的,无法在这个阶段中反悔。根据官方的文档说明,到了以太坊 2.0 的第 1 阶段后,验证人才有可能进行转账,到了第 2 阶段后,验证人才可以把这部分资产提取到某一个特定的分片,整个开发过程可能需要 2 年的时间。 承担风险的回报? 正因为承担了至少 2 年无法提现的风险,再加上权益证明(PoS)本身的通货膨胀机制,所有验证人可以在此期间以及之后获得整个网络的额外奖励,而在目前以太坊 1.0 中的 ETH 暂时还无法获得相应奖励。 如果质押量达到了信标链最低上线标准的 524,288 ETH,则这部分验证人可以获得的年化收益率约为 21.6%,随着验证人数量增加,APR 也会逐渐降低,最低为 4.9%。 以太坊 2.0 存款合约启用指南就到这里,如果您觉得本站的文章不错,欢迎分享给您身边的朋友们! 风险提示:本文内容均不构成任何形式的投资意见或建议。imToken钱包教程对本文所提及的第三方服务和产品不做任何保证和承诺,亦不承担任何责任。数字资产投资有风险,请谨慎评估该等投资风险,咨询相关专业人士后自行作出决定。imtoken钱包官网祝您投资过程中捷报连连!
  • imtoken教程:普通持币者如何参与Eth2?

    以太坊最近公布了全新的Eth2,目前已知可能是在下个月上线,今天的新闻是Eth2 的阶段 0 信标链将如期在 12 月 1 日正式启动。 理论上虽然 Eth2 达到了启动的质押门槛,但是参与到其中的普通用户却不多。原因之一是目前的质押门槛对普通用户来说太高了。现在参与质押的途径主要有这两种:自建节点和购买质押服务商的服务。下面就跟随小编一起来学习一下参与的教程吧! 一、自建节点 自建节点的教程网上搜一下就能找到,但这个方法更适合懂一点技术的极客,不太适合普通用户。在之前的文章《以太坊 2.0 存款合约启用》中讲过,自建节点在运行验证人节点程序时,假如遇到软件故障或网络长时间离线等原因会被扣除质押的 ETH。 另外,存入的 32 个 ETH 质押时间可能会超过两年,按照 3000 元的单价,32 个 ETH 的价值接近 10 万元。质押的年化利率在 4.9%~21.6% 之间,如果收益率能稳定在 20% 以上倒也十分可观,可要是后期由于验证节点数量不断增加,收益率下降至 4.9%,这个事情可能就得考虑考虑了。所以对于普通持币者而言,参与 Eth2 质押最合适的方式一定不是自建节点。 二、将自己的 ETH 提供给质押节点服务商 现在市面上的质押服务商有 InfStones、Hashquark、Stkr、Rocketpool 等。质押服务商可以分为中心化和去中心化两种,两者的区别在于解锁质押后,提取资金的私钥(withdraw key)是否在用户自己手中。但是目前还没有比较成熟的去中心化质押托管方案,可用性较高的均为中心化服务商提供的方案。 目前 Hashquark、Stkr、Rocketpool 支持「拼单」的方式,例如 Stkr 支持用户抵押最少 0.5 个 ETH,就可以和其他投资者「拼单」来凑齐 32 个 ETH,收益则按比例发放。 为了平衡中心化和去中心化的问题,Stkr 用户质押的 ETH 会进入 Stkr 合约,资产会保存在存款合约里,提币权限也是合约控制的,Stkr 计划通过社区 DAO 的方案治理,削弱中心化程度。 除了质押服务商的去中心化程度,普通持币人在进行选择时还需要考虑这三点问题: 1、服务商是否可靠,会不会跑路? 质押的 ETH 可能需要 2 年才能取出,如果在此期间服务商跑路了或者因为经营不善倒闭了,就会造成用户的资产损失。 2、服务商采用什么机制保护所质押资产的安全? 如果服务商在质押过程中由于断网、软件故障等原因,质押的 ETH 被罚没,那么这个损失是由用户自己承担还是服务商兜底,抑或是风险共担? 3、所质押的资产,是否可以获得流动性? ETH 存入合约地址后会暂时丧失流动性,本金和利息很有可能得在两年后才能取出来,就像是在银行做了定期存款。为此,一些质押项目提供了流动性解决方案,例如 Stkr 会根据用户存入其智能合约的 ETH 发放 aETH 流通到市场上。aETH 代表了用户在 Eth2 网络中的抵押存款凭证,是可以流动和交易的。 最后 选择服务商时的上述几个问题,如果自己上网做功课调研市面上所有的质押服务商的话,耗时耗力且获得的信息不一定准确。不过别担心,imToken 作为以太坊官网推荐钱包,会对市面上这些服务商进行深度调研,在钱包端集成优质的质押方案并在近期上线。对 ETH 质押感兴趣的用户,可以关注 imToken,我们会第一时间同步最新信息。 普通持币者如何参与Eth2的教程就到这里,如果您觉得本站的文章不错,欢迎分享给您身边的朋友们! 风险提示:本文内容均不构成任何形式的投资意见或建议。imToken钱包教程对本文所提及的第三方服务和产品不做任何保证和承诺,亦不承担任何责任。数字资产投资有风险,请谨慎评估该等投资风险,咨询相关专业人士后自行作出决定。imtoken钱包官网祝您投资过程中捷报连连!
  • 以太坊教程:Rollup Bridge 介绍(三):Celer cBridge

    本文受众:对汇总了解的区块链爱好者 Celer cBridge 是一个跨链资产转移方案,cBridge 同时支持了 L1 和 L2、以及 L1 与 L1 之间的桥接。我们可以从 cBridge 的 Web App 上看到他们已经支持了许多知名的 L1 和 L2 项目。 cBridge 支持的链种 本篇文章会时间在cBridge背后的技术实现,包含原理、契约实践以及运维的介绍。 道原则 cBridge 主要使用了 HTLCs 技术来实现跨链的资产转移,对于 HTLCs 不熟悉的读者,可以先参考这篇文章了解其原理以及应用场景:https://bcoin.io/guides/swaps.html 流程 cBridge 在其契约中 GitHub 的文件里描述了 cBridge 的道流程,以下为节选部分: 发送方在源链上发起转移交易 cBridge节点通过使用发送方的hashlock,在岸设置链上发起转账交易 发送方在源链上确认交易 cBridge 节点在目的地链上确认交易 为了帮助理解,我将一步步画成的如下图: cBridge 澜 下面会就四个关键步骤依序进行细节说明: 首发发送方发起转移交易 整个cBridge跨链的资产转移流程地址会由源链的发送方(即使用cBridge进行转帐的用户)发起帐单。发送方会负责产生哈希锁,设置转帐的时限,并与转的信息(令牌、 token 数量、目的地链代号、授权人地址)一起向部署在源链的 cBridge 合约发起转出请求。接收合约到请求后会的token数量,从发送方有将转移合约,导致转帐时限先要后转,才能将token取出。 第二步: cBridge 节点发起转账交易 在链下的cBridge节点会持续监控各链上cBridge合约的动作,当它发现源链上有突发的新转出请求,它会在链上获得转出的细节,主动对目的地进行部署链上的 cBridge 契约在请求中发起转移。 以协议方为指定的人地址,并使用与转让相同的哈希锁,限时转让以及取款时(约源链上设定限时2/3),准予转让的令牌 数量扣掉 cBridge 节点转发的成本和交通后,从 cBridge 节点转移到目的地链上的 cBridge 合约。 此时cBridge节点不知道,要外送方在第三步完成源链上转出散列锁,并揭散散列锁的答案后,cBridge本身有能力执行旅游链上转入的偏。 第三步:发送方确认交易 发送方确认 cBridge 节点有在目的地链上提交相应的转移后,就可以在请求链源上转移出请求的外部阶段。发送方首先要对源链的 cBridge 合约提交转移出哈希锁的答案,合约无误后,转出指定的令牌数量转移到cBridge节点,完成源链上转出的验证节点。 第四步:cBridge 节点确认交易 在链下的cBridge节点节点发送到监控方已经在源链上完成转出源后,准备好发送方节点时传播的哈希锁,到目的地链上的cBridge合约提交哈希锁,完成转入链上的链,此时的链上的人会收到来自源头的发送方,完成跨链的资产转移。 细节步骤看起来很繁琐,但对于cBridge App的用户来说,只要进行表演签名操作(第一步先转出,第三步对转出交易),并等待一些时间(3~5分钟) ,过程中完全不需要切换下载的网络,使用起来是非常简单流畅的。 退款 不小心是转出 自己转出在一个有效时间里转出,当有任何约定没有履行义务时,在设定的时限,自己有能力可以直接要求cB 合约免除任何人去处理转帐后的令牌,不需要提供哈希锁的答案。因为信用卡能够保护双方的资产,不会导致资产被永久锁在 cBridge 合约上。 因为是临时,目的地链的转出会比源链的转出更早,有可能cBridge节点对转出进行退款,用户才对转出进行确认,此时才会对用户造成损失。 当前cBridge Web App设置的转出时间截止时间为12,对应的转出时间约为12 * 2/3 = 8小时,时间相对充足,一般正常的转帐只需要几分钟,如果过程中出现非预期的状况,还可以有东南亚的反应时间处理。 简单的操作体验背后的代价 眼尖的读者可能已经发现,cBridge 道踏板中的第三与第四步,与典型的 HTLC 不同。 ,cBridge 节点可以到链源链取回它在链源公园付给每个人的链上。Celer官方说明这是为了提升用户体验,如果走典型的HTLC流程,用户在确认转出要外的步骤中,切换钱包的网络至目的地链,还需要专门在目的地链上的钱包里准备的gas token来支付自由的交易,对用户来说非常不方便。 因此cBridge调整了最后两个步骤的顺序,让用户只需要源源链进行操作,来致命的提升用户的体验。但这样的调整并不是没有成本,它会为用户带来额外的风险。 一个想链上:当用户在尝试源头,c桥节点收到用户的成功后,却没有在目的地链上将转移到海外给人(可能是、gas token或不足)是当机),节点节点链上的转账在生日当天,cBridge节点有能力对转账进行实时的操作,cBridge节点有可以无偿转帐用户获得的令牌。这部分必须仰赖用户自己的行动去降低风险,当你发现在有效区间内等了社交久的时间,国内人还没有得到目标,用户必须要自己主动去寻找链提供散列锁的答案,完成转移到特定的动作,以防止资产被恶意取走。 安全分析 综上所述,我们针对发送方和 cBridge 节点在 cBridge 四个操作步骤中可能产生的安全问题,进行分析与整理: 如果发送方执行了初步但是cBridge节点没有往下执行,此时发送方的资产会单方面被扣押在源链的cBridge合约中,必须要等待12小时,才能进行退款。 如果 cBridge 节点执行了第二步但发送方没有下执行,此时发送和 cBridge 节点资产的两个会被扣押押在源链和目的地链的 cBridge 合约中,必须更新帐单到期后,才能进行相关方需要的是,cBridge 能够在目的地链上的转移有更短的到期时间(8 小时比发送方更早完成)。 如果发送方执行了第三步但 cBridge 节点没有往下执行,此时发送已将资产转给 cBridge 节点,但目的地链上的新西兰人还没有收到相应的消息。到目的地链上的转移在到期后,cBridge 节点甚至有能力进行回转移,而导致发送方单方面的损失。 这个情况取方发送方带来安全疑虑,发送方需要在转入日期前(8 内),自己(或委托人)到目的地链上完成转入。人却迟迟没有收到任何收获,这时候就需要提高警觉了。 cBridge节点执行完第四步但交易没有成功(例如天然气),这时候发送方仍有损失的风险。以保护自己的资金安全。 契约实践 cBridge契约实践很简单,提供了转出、转入、确认以及退款的功能,人数众多,都是cBridge流中的核心动作,而且这些方法都可以让任何人去使用的。因此当节点在转帐过程中出现问题时,用户能够直接对资产进行操作,保护自己的。 cBridge 约定方法界面 特别要注意合约方法转出的第一个参数地址_bridge。这个参数链要填入才能为服务这些跨转帐需求(例如支持1,000 USDT从以太坊交易到Polygon)的cBridge地址,位置,用户在进行跨链转帐之前,必须先确定好要找哪个cBridge节点来服务。 Celer 官方提供了一个网关服务,负责 cBridge 节点的信息,用户将转帐的信息该给服务,它会尽快转用户转帐需求,且济州状态最好的岭节点(例如成功率高、低低等),用户在进行转接时填入塞勒推荐的cBridge节点。 由于 Celer 官方实际提供网关的相关信息,有技术背景的用户可以开始去操作 cBridge Web App,了解其背后的实践细节。 此外,契约里也有一些人可以去关注的重要事件: LogNewTransferOut事件:transferOut完成时会发出的事件,会记录转出的transferId。 LogNewTransferIn事件:transferIn完成时会发出的事件,会记录转入的transferId及其对应的转出的transferId(srcTransferId)。 在 cBridge 合约上不管是要确认呼叫请求,都需要提供 transferId,因此 transferId 在 cBridge 的应用中是控件的信息。除此之外,通过这两个事件的观察,帮助我们将跨链的转出和转入关联起来,有监控追踪转帐的状态,并在接下来发生的时候有什么能力。 cBridge 合约事件界面 节点运维 Celer官方自己开源了cBridge节点的实践,任何人都可以跑起的节点,但cBridge现阶段有白名单机制,想服务cBridge节点来服务用户一定要先跟官方接洽。 养节点的好处是可以从各个笔跨链转帐单中带一些带的链转帐,但还要考量到运维节点的,Celer 官方很贴心地在 cBridge 节点 GitHub 文件里详细了运维节点需要注意的事项,包括机器建议配备,支持的还有货币种类和需要提供的流动性,各条的建议链配置,运维节点数据的最佳操作等等,节点甚至建统计的API ,让运维者能够随时监控节点的交易状况。 从 GitHub 文件的程度以及量了运维节点的官方资料,可以找到 Celer 对社区的用心。 结语 以上是对于cBridge背后技术实现的介绍,如果有任何想要分享,想要了解更多,都可以一起讨论😃
  • 以太坊教程:Rollup Bridge 介绍(二):Hop Protocol

    本篇是 Rollup Bridge 介绍的第二篇,建议先从第一篇 Maker Bridge 看起: 以下所称 L2 皆指 Rollup 而非 Plasma 或侧链 以下所称「资产」和「代币」两个词指的是一样的东西 以下所称「七天」和「Rollup 挑战期」两个词指的是一样的东西 快速跨 Rollup 资产转移 如果你现在要从 Rollup A 把资产搬到 Rollup B,要怎么搬?答案是从 Rollup A 提款至 L1,再从 L1 存款到 Rollup B。所以你要等 Rollup A 的挑战期,然后再等 Rollup B 的存款到账(通常不会很久)才能成功完成跨 Rollup 的资产转移。 图片来源:Steven Wu from imToken Labs 而 Hop protocol 就像是前篇介绍里 fast withdrawl 的例子一样,只是现在流动性提供者是在 Rollup B 上去垫付而不是在 L1。以下会以 fast transfer 来指跨 Rollup 资产转移,以便和 fast withdrawl 做出区分。 从高维来看 Hop protocol 就跟 fast withdrawl 一样简单,流动性提供者承担资产锁住七天的风险及机会成本,收取手续费;使用者支付手续费,换取能快速把资产转移到另一个 Rollup 的服务。 注:Hop protocol 里把流动性提供者称作 Bonder。 而如同 fast withdrawl 的例子,如果没有人来垫付你的 fast transfer,你就必须自己走完正常的路线:回到 L1 再进到 Rollup B。 注:Rollup A 和 Rollup B 都支援 Rollup Bridge 的功能也是必要条件,否则无法安全可信地把转账讯息从 A relay 到 B 上。 不过实现 Hop protocol 其实没有这么简单。首先,每一个 Rollup 的提款方式、挑战期以及存款时间都不一样。每一个 Rollup 都需要 Hop protocol 团队去对接。 注:Hop protocol 也可以接上 ZK Rollup,ZK Rollup 因为没有挑战期所以设计会比较不一样,但一样需要团队去对接。 而整个 Hop protocol 的安全性会取决于其所接入的 Rollup 中安全性最低的那个。如果某一个 Rollup (或甚至 Rollup 上面的某一个代币合约)出现漏洞,导致攻击者可以任意凭空印钞,那攻击者就可以马上通过 Hop protocol 来换成其他 Rollup 上的资产。 其实就和跨链桥一样,你的防守范围从一条链变成了多条链上的无数个资产,其安全性不容轻忽。 接下来会介绍一些 Hop protocol 的设计细节 批量处理 如果每一笔 transfer 背后对应的 Rollup A -> L1 -> Rollup B 步骤,流动性提供者都要一笔一笔跑过一次,那会耗费很多 gas。所以 Hop protocol 提供批量处理的功能,流动性提供者可以等待一段时间,收集垫付完的 transfer,再把它们一并处理。 hToken hToken 是 Hop protocol 的代币,但这个不是治理代币,而且每个代币在 Hop protocol 里都有相对应的 hToken,例如 ETH 有 hETH,DAI 有 hDAI。 为什么需要 hToken? 首先,它能统一代表同一种代币,简化使用介面的复杂度:使用者不需要选择他要换的是 Optimism ETH 还是 Arbitrum ETH,使用者操作的都是 hETH。 其次,Hop protocol 不需要负责维护一个正统代币的清单。任何人都可以在 Rollup 上发行一个 Dai 合约,那 Hop protocol 要怎么知道哪一个才是 Maker 团队部署在 Rollup 上的 Dai 合约?答案是:Hop protocol 不需要知道,它只需要知道 hDAI。(你可能会想:拿到 hDAI 可以干嘛?hDAI 等于 Dai 吗?我们马上就会讲到) 最后,延续上一点。假设今天没有 hDAI,而我要从 Rollup A transfer Dai 到其他 Rollup。Hop protocol 就必须在 Rollup A 上记载 Rollup B C D E … 上的 Dai 合约地址,而且其他 Rollup 也都要依照办理。所以这样全部 Rollup 上总共记载的数目会是 NNM(N 是 Rollup 数量,M 是代币数量)。另外,谁有权力决定哪一个 Dai 合约才是正统? 好,那我今天拿到 hDAI 后可以干嘛?答案是拿去 AMM 换成 Dai。我们先不讨论 AMM 从哪里来,因为只要有诱因就会有人建出 hDAI/Dai 的 AMM 交易对并提供流动性。 注:这里的 AMM 指的 L2 上的 AMM。 先介绍 hToken 哪里来:任何人都可以到 L1 的 Hop protocol 合约抵押代币获得 hToken,例如抵押 Dai 获得 hDAI。流动性提供者一定会需要抵押来获得 hToken,因为他们垫付的代币会是 hToken。 接下来,假设使用者要从 Rollup A 把 Dai transfer 到 Rollup B,这过程会包含 (1) 把 Dai 换成 hDAI、 (2) transfer hDAI 到 Rollup B、 (3) 在 Rollup B 上把 hDAI 换成 Dai 其中 (1) 和 (3) 都会有 Dai/hDAI 互换的需求,有需求自然就会有人愿意提供 Dai/hDAI 流动性来赚取手续费。 图片来源:Steven Wu from imToken Labs 当然,如果你没有被说服为什么需要 hToken,那 hToken 和 AMM 看起来就会像是故意挤出来扒使用者皮的玩法。你可以想想看假设没有 hToken 的话,这个 protocol 的哪些运作流程、使用者介面会长得不一样,会是更好、还是更坏。(或许真的会变得更好?) 最后是一些我想到的可能的问题。 手续费怎么估?如果没有人垫付? 你可能有注意到,这个垫付的模式是你直接申请 transfer 然后等人来垫付,所以你在申请 transfer 时就要写好你愿意支付的手续费是多少,如果你的手续费太低,那下场就会是你要自己跑完 transfer 过程 — 等待七天。 另外一个模式是你和流动性提供者先在链下协议好手续费,然后再送 transfer 申请到 Rollup。但是因为现在是在两条不同 Rollup 上,表示交易不会是原子的:如果你在 Rollup A 上送出了你和流动性提供者协议好的 transfer,结果流动性提供者没有在 Rollup B 上依约垫付给你,你必须要有管道能够在 Rollup B 上证明你在 Rollup A 上和该流动性提供者的 transfer 协议。而这个管道会需要 Rollup B 能够读取到 Rollup A 的交易(因为这样才能以去中心化的方式来证明),这并非做不到,但是考量到其复杂度和带来的效益,可能不太值得。 所以目前这个模式会是比较可行的,但也表示计算手续费这边要小心,避免没有人来垫付,导致使用者要等七天。 另外不同 Rollup 上收取 gas 费用的方式不一样,也是 Hop protocol 团队在设计估算手续费功能需要注意的地方。 Happy case 以外情况的 demo? 目前 Hop protocol 团队提供的 demo 只有 happy case 的 demo,没有 demo 发生没人垫付的情况或是流动性提供者平常在不同 Rollup 间搬运、平衡资产的过程。
  • 以太坊教程:Rollup 不完全指南(精选)

    Rollup 最近在 Ethereum 社区风靡一时,有望在未来成为 Ethereum 的主要扩容解决方案。但这项技术到底是什么样的呢?它可以给我们带来什么变化?我们如何使用这项技术?这篇文章将试图回答其中的一些关键问题。 背景:什么是 Layer 1 和 Layer 2 扩容? 目前主要有两种区块链扩容方式。 首先,你可以直接提高区块链交易吞吐量,但这类技术主要挑战为「当区块容量越大时,区块链将更难以验证,而且很可能逐渐变得更中心化」。为了避免这样的风险,开发者可以提高客户端软件的效率(译者注:比如 Turbo Geth),或者使用 Sharding 技术让构建和验证工作分散到许多节点上,目前 Ethereum 准备借助 Eth2 升级引入 Sharding 技术。 其次,你也可以改变使用区块链的方式。用户不必将所有交易放在区块链上,而是可以通过 Layer2 协议在链下执行大部分交易。即链上的智能合约只需执行两个任务:处理存取款和验证链下交易的有效性。由此减轻链上负担,提高交易处理效率。 State channels vs plasma vs rollups 目前主要有三种 Layer 2 扩容方案:State channels、Plasma 和 Rollups,这三种各有优劣。 译者注:译文中省略 State channels 和 Plasma 科普内容,主要讲述 Rollups 部分。 术语说明 Batch:批处理交易,指将 Layer2 交易批量打包并提交到 Layer1 的 Rollup 合约。 Sequencer:排序者,指在 Layer2 上打包排序交易的角色,类似 Layer1 的矿工。 State root:状态根,指 Layer2 上所有状态(账户余额、合约代码等)通过 Merkle Tree 生成的哈希值。 Rollups 参考:Optimistic rollups: https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/optimistic_rollups/ 和 ZK rollups。:https://docs.ethhub.io/ethereum-roadmap/layer-2-scaling/zk-rollups Plasma 和 State Channels 是「完全」的 Layer2 方案,因为它们试图将数据和计算都转移至链下。然而,由于存在「数据可用性的博弈问题」,意味着这两种方案不可能安全地满足所有应用场景。Plasma 和 State Channels 通过依赖所属权的 owner(译者注:因为提交欺诈性证明需要证明资产所属权,这也是为什么 Plasma 采用 UTXO 方案,所以无法解决像 Uniswap 资产所属权场景的问题。感谢 Chih Cheng Liang 指点)来解决该问题,但这使它们无法完全通用化。 另一方面,Rollups 是一种「混合」的 Layer2 方案。Rollups 将计算(以及状态存储)转移至链下,但同时将每笔交易的部分数据保留在链上。 为了提高效率,他们使用了不少 fancy 的压缩技巧,尽可能地使用「计算」代替「数据」。其结果是系统的扩容仍然受限于底层区块链的数据带宽,但效率是可观的:Ethereum ERC20 代币转账成本约为 45,000 gas,而 Rollup 中的 ERC20 代币转账仅使用 16 字节的链上空间,成本低于 300 gas。 事实上,数据上链是关键(注意:将数据放在 IPFS 上是行不通的,因为 IPFS 不提供任何给定数据是否可用的共识,所以数据必须放到区块链上)。将数据放在链上并获得共识,如果任何人愿意,他们可以在本地处理 rollup 中的所有操作,从而允许他们监测欺诈交易,请求提款,或亲自生成 transaction batches。因为没有数据可用性问题,所以恶意或离线运营者所造成的损失会更少(比如他们不能造成 1 周的延迟),从而为谁有权发布 batches 打开了更大的设计空间,并简化 rollups 系统。最重要的是,没有数据可用性问题也意味着不再需要将资产映射到 owners。 这是 Ethereum 社区对 rollups 比以往的 Layer2 扩容方案更兴奋的关键原因:Rollups 是完全通用的,我们甚至可以在 rollup 内运行一个 EVM,使得现有的 Ethereum 应用不必编写过多新的代码就可以迁移到 rollups 上。 那么 Rollup 到底是如何工作的呢? 链上会有一个智能合约维护着 state root:rollup 状态的 Merkle root(即 rollup 内部的账户余额、合约代码等信息的 Merkle 化)。 任何人都可以发布一笔 batch 交易,这是一个高度压缩的交易集合,包含旧的 state root 和新的 state root。合约会检查 batch 中的旧 state root 是否匹配当前的 state root,如果匹配,则将 state root 更新到新的 state root。 为了支持存款和提款,我们增加了交易的能力,其输入或输出是「外部」的 rollup 状态。如果一个 batch 来自外部的输入,那么提交该 batch 的交易也需要将这些资产转移到 rollup 合约中。如果一个 batch 有对外的输出,那么在处理该 batch 时,智能合约将会执行「提现」操作。 这一切就这么简单! 除了一个主要的细节:如何知道 batch 中的 post-state roots 是正确的呢? 如果有人可以用任意 post-state root 提交一个 batch 而没有任何惩罚,他们就可以直接将 rollup 内的全部资产转给自己。这个问题有两种截然不同的解决思路,从而衍生出两种「口味」的 rollup 方案。 Optimistic rollups VS ZK rollups 以下是这两种「口味」的 rollups 方案描述: Optimistic rollups,采用欺诈性证明:rollup 合约会跟踪历史的 state roots 和每一个 batch 的哈希值。如果有人发现某个 batch 的 post-state root 不正确,那么他们可以向合约提交证明,证明该 batch 计算错误。合约验证该证明有效后,会对该 batch 和之后的所有 batch 进行回滚。 ZK rollups,采用有效性证明:每一个 batch 都包含一个称为 ZK-SNARK 的密码学证明(例如采用 PLONK 协议),它可以证明 post-state root 是执行该 batch 的正确结果。无论计算量有多大,合约都可以迅速地在链上验证证明。 但两种「口味」的 rollup 之间有着复杂的权衡: 方案权衡:https://www.notion.so/50a740eec456419089d93f3ec3008ad0 总的来说,我的观点是: 短期内,Optimistic rollups 很可能在通用的 EVM 计算中胜出,而 ZK rollups 则可能在简单的支付、交易和其他特定应用场景中胜出,但最终从中长期来看,随着 ZK-SNARK 技术的改进,ZK rollups 将在所有场景中胜出。 欺诈性证明剖析 Optimistic rollup 的安全性主要取决于:如果有人将一个无效 batch 发布到 rollup 合约中,那么保持跟踪链上信息并发现欺诈的任何人都可以发布欺诈性证明,向合约证明该 batch 无效并回滚。 如图所示,声称某 batch 无效的欺诈性证明将会包含这些绿色数据:该 batch 本身(对照存储在链上的哈希值核对)和 Merkle tree 的部分内容,从而证明该 batch 读取或修改特定账户。 而该树中的黄色节点可以从绿色的节点重建,所以不必提供。这些数据足以执行该 batch 并计算 post-state root(注:类似 stateless clients 验证单个区块的方式)。如果计算出的 post-state root 和该 batch 中提供的 post-state root 不一样,那么说明该 batch 具有欺诈性。 如果一个 batch 存在错误,但之前所有的 batches 都是正确的,那么就可以创建一个欺诈性证明以表示该 batch 是错误的。 请注意对旧的 batches 声称无效的处理:如果存在多笔无效 batches 提交到 rollup 中,那么最好尽量证明最早无效的 batch。当然,如果一个 batch 是正确的,那么永远不可能创建一个欺诈性证明以表示其无效。 Rollups 是如何压缩数据的? 一笔简单的 Ethereum 交易(比如发送 ETH)通常消耗约 110 字节。然而,在 Rollup 上发送 ETH 仅仅消耗约 12 字节。 字节消耗对比 为了达到这样的压缩效果,一方面是采用了更简单高级编码,而目前 Ethereum 的 RLP 在每个值的长度上都浪费了 1 字节。另一方面,还有一些巧妙的压缩技巧: Nonce:该参数的目的是为了防止「重放」。如果账户的当前 nonce 是 5,那么该账户的下一笔交易必须使用 nonce 5,但一旦交易被处理,那么该账户中的 nonce 就会被递增到 6,这样采用 nonce 5 的交易就不会被执行。在 rollup 中,我们可以完全省略 nonce,因为我们只是从 pre-state 中恢复 nonce。同时由于签名会采用最新的 nonce 进行检查,如果有人试图使用旧的 nonce 重放交易,那么签名将无法通过验证。 Gasprice:我们可以允许用户使用固定范围的 gasprices 进行支付,例如 2 的 16 次幂(译者注:主要为了节省字节)。或者,我们也可以在每笔 batch 中收取固定费用,甚至可以将 gas 支付完全移到 rollup 协议之外,让交易者通过特定渠道向 batch 创建者支付费用。 Gas:我们同样也可以将 gas 设置为 2 的多次幂。另外,我们也可以在 batch 层面设置 gas 限制。 To:我们可以使用「索引」来代替 20 字节的地址(例如:一个地址是「树」中的第 4,527 个地址,我们就可以用索引 4,527 来表示它,同时我们也会在状态中添加一个子树来存储索引到地址的映射)。 Value:我们可以用科学计数法存储 value。在大多数情况下,转账仅需 1~3 有效位。 Signature:我们可以使用 BLS 聚合签名,它允许许多签名聚合成一个约 32-96 字节的签名(取决于协议)。然后,这个签名可以一次性对整个消息集和发送者进行 batch 检查。表中的 ~0.5 表示一个区块中可验证的聚合签名的数量是有限制的,因为它需要在一次欺诈证明中验证签名。 ZK rollups 特有的一个重要压缩技巧:如果交易的一部分仅用于验证,并与计算状态更新无关,那么这部分可以省略。这在 Optimistic rollup 中是做不到的,因为该数据仍然需要包含在链上,以防将来欺诈性证明检查所需,而在 ZK rollup 中,证明数据正确性的 SNARK 已经提供了任何验证所需的数据。 一个重要的例子是隐私保护 rollups:在 Optimistic rollup 中,每笔交易中 ~500 字节用于隐私的 ZK-SNARK 需要上链,而在 ZK rollup 中,覆盖整个 batch 的 ZK-SNARK 已经足以表明「内部」的所有 ZK-SNARKs 是有效的。 这些压缩技巧是 rollup 扩容的关键,如果没有这些技巧,rollup 或许只能在基础链的扩容上有大约 10 倍的提升(在一些特定的计算量大的应用中,简单的 rollup 也已经很强大),但有了这些压缩技巧,几乎所有应用的扩容系数都可以超过 100 倍。 谁可以提交 batch? 关于哪些人可以在 Optimistic rollup 或 ZK rollup 中提交 batch 的问题存在许多流派。一般来说,大家都认为提交 batch 的用户必须先交纳一大笔押金,如果该用户提交欺诈性的 batch(例如采用一个无效的 state root),那么这笔押金的一部分将被烧掉,另一部分作为奖励给到提交欺诈性证明的用户。但除此之外,还存在许多可能性: Total anarchy:任何人都可以在任何时候提交 batch。这是最简单的方法,但它有一些严重的缺点,比如存在这样的问题:多个参与者同时生成并试图提交 batch,而其中仅有一个 batch 可以成功被收录。这将导致大量的浪费,比如没有意义的生成 batch 证明或者提交 batch 到链上。 中心化的 Sequencer:通过 Sequencer 这样的角色提交 batch(除了提现操作:首先由用户自己提交提现请求,如果 Sequencer 在下一个 batch 中没有处理该提现交易,那么用户可以亲自提交一个 batch 处理提现)。这是最「高效」的,但它依赖于一个中心化的角色。 Sequencer 拍卖:通过拍卖(比如每天)来决定谁有权利成为第二天的 Sequencer。这种方案的优点是可以筹集资金,而这些资金可以通过 rollup 的 DAO 来分配(参考:MEV 拍卖)。 从 PoS 集合中随机选择:任何人都可以将 ETH(或者 rollup 协议的代币)存入 rollup 合约中,每一个 batch 的 sequencer 都会从其中一个存款人中随机选择,被选中的概率与存款金额成正比。这种方案的主要缺点是大量资产被锁定,导致资金效率低。 DPoS 投票:Sequencer 通过拍卖选中,但如果他们表现不佳,那么代币持有者可以投票将其踢出,并举行新的拍卖来替代他们。 改进提交 batch 和 state root 的方式 目前一些正在开发的 rollup 方案采用的是 “split batch” 模式,即提交 Layer2 batch 的动作和提交一个 state root 的动作分开执行,这会有一些关键优势: 你可以允许许多 sequencers 并行发布 batch,以提高抗审查能力,而不用担心一些 batch 会因为其他 batch 已经被打包而无效。 如果一个 state root 存在欺诈,你不需要回滚所有 batch,仅恢复该 state root 即可,并等待有人为该 batch 提供新的 state root。这样可以更好地保障交易发送者的交易不会被回滚。 总的来说,这是一个相当复杂的技术组合,它们试图在涉及效率、简单性、抗审查和其他目标的复杂权衡中获得平衡。但现在谈哪种组合最有效还为时过早,而时间会证明一切。 Rollups 将会带来多大的扩容? 目前 Ethereum 的 gas limit 是 1,250 万,交易中每个字节的数据需要消耗 16 gas。那么如果一个区块仅包含一个 batch(我们假设使用 ZK rollup,将会消耗 50 万 gas 用于验证证明),那么该 batch 会有(1,200 万 / 16)= 75 万字节。如上图所示,每一位用户转账 ETH 仅消耗 12 字节,那么也就是说,该 batch 最多可以包含 62,500 笔交易。 在平均区块时间为 13 秒的情况下,这相当于达到约 4,807 TPS(对比 Ethereum 目前 ETH 转账的 1,250万 / 21,000 / 13 约为 45 TPS)。 部分用例扩容提升规模 那么扩容上限可以这么计算: (L1 gas cost) / (bytes in rollup 16) 12million / 12.5million。 现在值得注意的是这些数字还是过于乐观,原因有几个: 首先,最重要的是一个区块几乎永远不会仅包含一个 batch,因为将可能会存在多个 rollup 方案同时运作。第二,存款和提款将持续存在。第三,短期内使用量会很低,所以固定成本成为主要消耗。但即使将这些因素考虑在内,预计扩容规模也会超过 100 倍。 现在,如果我们想要超过 ~1,000 - 4,000 TPS,该怎么办呢?这就是 ETH 数据分片的意义所在,sharding 建议每 12 秒开辟一个 16MB 的空间,这个空间可以被任何数据填满,系统保证对这些数据的可用性达成共识,而这些数据空间可以被 rollup 使用。 这个约 1,398 kB/s 的数据量比当前 Ethereum 60 kB/s 提高了 23 倍,从长远来看,数据容量有望进一步增长。因此,使用 Eth2 分片数据的 rollup 可以处理高达约 100k TPS,未来甚至会更多。 Rollup 还有哪些尚未解决的挑战? 虽然现在 Rollup 的基本概念已经被大家所熟知,我们也很确认它们从根本上是可行的、安全的,以及已有多个 rollup 方案被部署到主网上,但 rollup 的设计仍然存在许多地方没有被很好地探索,将 Ethereum 生态系统的大部分内容完全迁移到 rollup 上以利用其扩容能力也存在不少挑战: User and ecosystem onboarding - 使用 rollups 的应用不多,用户对 rollups 也不熟悉,目前很少有钱包开始整合 rollups,而商家和慈善机构还不接受它们用于支付。 Cross-rollup transactions - 有效地将资产和数据 (例如 oracle 输出) 从一个 rollup 转移到另一个 rollup 中,而不会产生经过 Layer1 的费用。 Auditing incentives - 如何最大限度地提高至少一个诚实节点会真正全面验证一个 Optimistic rollup 的概率,以便出错时他们会发布欺诈性证明。对于小规模的 rollup(几百个 TPS 以下)来说,这不是一个重要的问题,可以简单地借助利他主义,但对于更大规模的 rollup 来说,需要更严谨地推理这个问题。 Exploring the design space in between plasma and rollups - 是否存在一些方法可以将状态更新的相关数据放在链上,而不是所有的数据。 Maximizing security of pre-confirmations - 许多 rollup 为了更快的用户体验,提供了一个「预确认」的概念,即 sequencer 立即给予一个承诺,交易将被包含在下一个 batch 中,如果他们食言,sequencer 的押金将被销毁。但这种方案的经济安全性是有限的,因为可能同时向许多用户做出承诺,这种机制能否获得改进? Improving speed of response to absent sequencers - 如果一个 rollup 的 sequencer 突然下线,那么快速和经济地从这种情况中恢复过来将是非常有价值的:要么快速且经济地大规模退出到另一个 rollup,要么更换 sequencer。 Efficient ZK-VM - 生成通用 EVM 代码的 ZK-SNARK 证明(或者将现有的智能合约编译适配到其他 VM)可以被正确执行,并且有一个明确结果。 结论 Rollups 是一种强大的 Layer2 扩容范式,预计将成为 Ethereum 短期和中期(甚至长期)扩容的基石。我们已经看到了 Ethereum 社区对此感到大大的兴奋,因为这与之前的 Layer2 扩容方案不同,它们可以支持通用的 EVM 代码,允许现有的智能合约轻松迁移。 这是通过一个关键的妥协来实现的:放弃将数据和计算完全放在链下,而是将每笔交易的少量数据留在链上。 Rollups 方案有很多种,在设计空间上会有很多选择:可以采用欺诈性证明的 Optimistic rollup,或者采用有效性证明的 ZK rollup(又名 ZK-SNARKs)。Sequencer(可以将交易 batch 发布到链上的用户)可以是一个中心化的角色,也可以是一个去中心化的角色,或者是介于两者之间的其他选择。 总的来说,Rollup 仍然是一项早期阶段的技术,一切仍在迅速发展,特别是 Loopring,ZKSync 和 DeversiFi 已经运作了几个月。期待在未来的几年内,Rollup 领域会出现更多令人兴奋的工作成果。
  • 以太坊教程:Rollup Bridge 介绍(一):Maker Dai Bridge

    作者:Nic Lin,imToken 资深区块链工程师 本文受众:对 Rollup 有所了解的区块链爱好者 Maker 的 Optimism Dai Bridge 是一个 Optimistic Rollup 上的快速资产提领协议。 Photo by Wilbur Wong on Unsplash 在介绍 Maker Bridge 之前,你要先对 Rollup 有一些了解,本文不会对 Rollup 做太多介绍。 了解 Rollup Rollup 未来在以太坊的角色:https://www.hopo-bright.com/ydf/291.html Vitalik:Rollup 不完全指南(精选):https://www.hopo-bright.com/ydf/312.html 在 Optimistic Rollup(Rollup 的其中一种)设计中,都先假设交易是正确的,如果发现有错再透过欺诈性证明来挑战错误的交易,但也因为要让欺诈性证明有时间可以送达,所以会有一段称为挑战期的延迟时间。一笔交易要等到顺利通过挑战期后(期间没有被挑战),链上合约才会接受它是正确的。 但这个挑战期也因此成为影响 Optimistic Rollup 使用者体验的缺点,所以有人提出了快速资产提领协议来解决这个使用体验的痛点。 在进入正题之前,先对标题做一些解释。首先,要能达到「快速」资产提领,并不是因为这些 Rollup 真的支持快速提领资产,而是需要一个中介商、一个流动性提供者来先垫付资产。 其次,标题是 Rollup Bridge 的介绍,但 Rollup Bridge 可以用来指该 Rollup 本身提供的 L1 <-> L2 Bridge,也可以用来指其他建构在 L1 <-> L2 Bridge 之上的 Bridge。本文介绍的是后者:搭建在 Optimism L1 <-> L2 Bridge 之上的 Maker Dai Bridge,用来让使用者快速提领资产回 L1。 快速资产提领是我从 fast withdrawal 翻过来的,可能有其他更好的翻译 以下所称的 L2 皆指 Rollup 而非 Plasma 或 Sidechain 以下所指 Rollup 为 Optimistic Rollup,因为 Optimistic Rollup 才有挑战期的问题 以下所称「资产」和「代币」两个词指的是一样的东西 以下所称「七天」和「Rollup 挑战期」两个词指的是一样的东西 以下 「Rollup Bridge」 指的是 Rollup 本身提供的 L1 <-> L2 Bridge,「Maker Dai Bridge」 指的是搭建在 Rollup Bridge 之上的 Bridge Rollup Bridge Rollup 的安全性是锚定在它所在的 L1 上的(例如 Optimism 锚定在 Ethereum 上):你要针对 L2 的交易进行审查攻击,等同于对 L1 交易进行审查攻击;你要重组 L2 ,进行双花攻击,等同于你要重组攻击 L1。 Rollup Bridge 是 L1 和 L2 互动的管道,你要从 L1 送讯息到 L2 合约或是你要把 ETH 存到 L2,都是透过 Rollup Bridge 来帮忙把讯息传递过去;反之亦然,你要从 L2 送讯息到 L1 合约或是你要把 ETH 提回 L1,也是透过 Rollup Bridge。Rollup Bridge 的安全性和 L2 交易的安全性是一样的,不会因为它多跨到了 L1 所以更不安全。 所以 Rollup Bridge 代表的是什么意思?Rollup Bridge 提供了一个安全、去中心化的方式让 L1 和 L2 能够进行互动、让 L1、L2 的资产能够互相转移。 注:Rollup Bridge 不是自然而然就会出现的东西,它不会因为你今天做了一个 Rollup,就自动生出 Rollup Bridge 的功能,而是要搭配你的 Rollup 协议来打造你的 Rollup Bridge。 如果你透过跨链桥用 MPC 的方式来执行跨链交易,你需要相信参与 MPC 的节点。但在 Rollup Bridge 里没有这样的角色,透过 Rollup Bridge 送讯息就跟送 Rollup 交易一样,其安全性和抗审查性是受 Rollup 本身所保障,所以才会说 Rollup Bridge 是去中心化的方式. Fast withdrawal(快速提领资产回到 L1) 一开始有说到,「快速」并非真的是 Rollup 支持快速转移资产,而是有一个流动性提供者来先垫付这笔资产。 Rollup 的挑战期是为了确保交易的安全性,所以任何人要从 L2 提取资产回 L1 都不可避免地要等待挑战期。不过如果今天你相信一笔提现交易是正确可信的,并且你也相信重组攻击很难会发生,所以你愿意冒这个险的话,你就可以提议在 L1 先代垫这笔提现交易,并从中间抽点手续费。反之,如果对方希望一个小时后(而非七天后)就能在 L1 拿到钱,且愿意被抽点手续费的话,那就成交,两边都开心。 运作流程 对方先在 L2 透过一个 fast withdrawal 合约来申请 fast withdrawal,fast withdrawal 合约背后走的一样是正常的提取流程,要等七天。这时候你看到了这笔 fast withdrawal 交易,且确认这笔交易是可信、很难被重组攻击后,你就到 L1 的 fast withdrawal 合约申请垫付,垫付的对象会是该笔 L2 fast withdrawal 交易的 ID。 注:这时候 L1 的 fast withdrawal 合约还不知道有这笔 L2 fast withdrawal 交易的存在。 等到七天挑战期过了,这个 L2 fast withdrawal 交易会被传递到 L1 fast withdrawal 合约。如果你之前有先垫付这笔交易,合约里会有纪录,那合约就会直接把这笔交易所提领的资产转给你。如果没有人来垫付,那合约就会照正常流程,把提领的资产转给当初的提领者。 注: 你垫付的金额会是对方提领的金额扣掉给你的手续费。 如果没有 Rollup Bridge,就没办法安全可信地把 fast withdrawal 讯息 relay 到 L1 上,就不会有人敢先做垫付的动作,因此 Rollup Bridge 是 fast withdrawal 的必要条件之一。(当然 Rollup 团队是一定会做出 Rollup Bridge 的功能的,否则没有人会想要用这个 Rollup) Maker Dai Bridge Maker Dai Bridge 大致是就是上面描述的 fast withdrawal,只是里面的流动性提供者不是别人,而是 Maker 的财库。 如同你放入抵押品(例如 ETH),Dai 财库就会铸造出 Dai 给你。 Maker Dai Bridge 也是相似的概念,你放入提领 Dai 的凭证(这个凭证要等到挑战期过后才能提领 Dai),Dai 财库铸造出 Dai 给你。等到挑战期过了,你就可以偿还借款、拿出抵押的凭证并用凭证去领出 Dai。 这个铸币的功能将会让 Maker Dai Bridge 在 fast withdrawal 服务的竞争里占尽极大优势,因为它不像其他流动性提供者一样要承担资本利用率、资产曝险的风险,而且理论上它的流动性可以到无限大。再来,因为抵押和借出的资产都是 Dai,也不需要考虑被清算的可能。最后,除非 Rollup 被攻击破坏,否则这些借款都会保证如期还款。 缺点 但 Maker Dai Bridge 也不是没有缺点,这个缺点是:它的安全性要多仰赖一个对象 — 它的 Oracle(预言机)服务。 注:Maker 协议本身有一群中心化的 Oracle 负责将代币在现实世界中的价格送到链上。Maker 协议仰赖这些 Oracle 的报价来决定哪些贷款已经进入可清算的状态。 因为 Dai 财库自己没办法判断 L2 上的提领是否是有效的,所以需要一个第三方在链下模拟交易执行,确认提领的有效性。就像 Optimisitic Rollup 节点不需要等 Operator 上传最新的状态,自己模拟交易执行都能得到正确的状态。 所以 Maker Bridge 会直接沿用原本已经建立好、经过实战测试的 Oracle 服务来担任这个第三方。 运作流程 首先是使用者把 Dai 存到 L1 Maker Bridge,L2 Maker Bridge 会铸出 oDAI 给使用者去用。 当使用者要提领回到 L1 时,向 L2 Maker Bridge 申请提领、销毁 oDAI。等待一段时间,这笔 L2 提领交易被放进 L1 的 Rollup 合约的交易日志后,Oracle 就可以执行并判断这笔 L2 提领交易的有效性。如果有效,Oracle 会到 L1 Maker Bridge 上批准,L1 Maker Bridge 会铸造出 fDAI 给使用者,这个 fDAI 是一个领取凭证,等到 L2 提领交易的挑战期结束后,可以拿这个领取凭证去取出 Dai。使用者接着拿 fDAI 到 Dai 财库去抵押换出 Dai 来使用。 最后,当 L2 提领交易的挑战期结束后,使用者(或其他人)就可以偿还借款、取出 fDAI 并用 fDAI 去提领 Dai。 注:fDAI 会是以 NFT 的形式存在,因为每一笔提领的解锁时间都不同,所以会是 Non Fungible(非同质化)。 为什么还需要多一层 fDAI? 假设没有 fDAI,Oracle 批准后 L1 Maker Bridge 就直接解锁 Dai 给使用者。则当 Oracle 作恶时,会导致 L1 Maker Bridge 的 Dai 被解锁拿走,这时候 Maker Bridge 上的 L1 Dai 会比 L2 oDAI 还少,这会导致 L2 有部分的人的 oDAI 会提领不出来。所以 Maker Bridge 改成用 fDAI 抵押借款的方式,把风险转嫁到 Dai 财库,也就是 Maker 代币的持有者:当 Oracle 作恶时,结果会是 Dai 财库新增一笔坏账,但 Maker Bridge 上的 L1 Dai 和 L2 oDAI 还是维持 1:1 的映射。 注:这边会需要设计让使用者有偿还贷款、取回 fDAI 并拿 fDAI 去领回当初提领的 Dai 的动机,否则抵押 fDAI 能借出 100% 提领的 Dai 的金额,那使用者就没有动机去完成提领的动作,Maker protocol 就只能自己负担这个成本。fDAI 抵押只能借出 X%(X < 100) 或是使用者提领时能退回部分手续费都是可能的机制,细节要等到 Maker Bridge 测试完才能知道。 附注 目前 Maker 只支持 Optimistic Rollup(更准确地来说是只有 Optimism),因为当前的 ZK Rollup 大多数都还未支持 L1 <-> L2 的互动(如前述,这是必要功能)。而且 ZK Rollup 的挑战期比 Optimisitc Rollup 的挑战期要短得多,快速资产提领不会是 ZK Rollup 使用者急需的功能。 目前 Maker Optimism Dai Bridge 仍在测试中。 一样的设计可以用于其他 Optimistic Rollup,例如 Arbitrum。只需要针对 Arbitrum 的 Rollup Bridge 来做相对应的修改。 Thanks to Kimi Wu and Chang-Wu Chen.
  • 以太坊知识:EIP-1559是什么?

    关于 EIP-1559 EIP-1559 将调整当前以太坊主网(Eth1)的矿工费机制。该提案将引入 baseFee(基础费用),baseFee 会根据以太坊区块空间的使用情况自动调整链上操作所需的 Gas Price,从而帮助钱包服务商和用户便捷估算操作的费用。 此外,EIP-1559 增加了一个新的交易类型,该类型允许用户自主设定对当前操作愿意支付的最高费用(maxFee)和支付给矿工的最高费用(maxPriorityFee),并可将最高费用与 baseFee 和矿工费用的差值退还用户。 而且,EIP-1559 将销毁 baseFee(基础费用),一定程度上减缓 ETH 的通胀速度,因此,社区中不少人认为这是对以太坊经济的一项重要改进。 imToken 如何支持 EIP-1559 imToken 支持伦敦升级,对本次升级用户无需进行额外操作。 升级完成后,imToken 用户仍可以正常使用当前版本 imToken 的以太坊钱包功能并发送交易。交易中的矿工费设置以 GasPrice 表示,GasPrice 的预估将基于 EIP-1559 规则。 关于自定义设置 EIP-1559 费用机制中的 maxPriorityFee(支付给矿工的小费)和 maxFee(最高费用),该功能预计将在后续版本 imToken v2.9.6 中尽快提供。 关于交易费用的变化,对此我们暂时无法预计,需要在 EIP-1559 启动后继续观察。 EIP-1559 设计目标 更好的用户体验 当前的以太坊和比特币都采用第一价格竞拍机制,这种费用机制简单但缺乏效率,其中最大的问题在于费用估计。EIP-1559 试图通过让所有的交易尽可能支付相同的费用来解决该问题。多数情况下,用户只需要决定是否发起交易,而无需考虑费用该如何设置。 可变区块容量 区块空间利用率往往是变化的,有些区块空间闲置,而有些区块塞满交易。可变区块容量将允许区块大小随实际需求变动。 更好的安全性 当区块奖励消失,仅靠交易费用不足以激励矿工维护网络安全。EIP-1559 通过销毁交易费用,即可在不增加总供应量的前提下,延长通过区块奖励激励矿工的时间,从而保障网络的安全性。 防止经济抽象 简单来说,即只允许使用 ETH 支付交易费用。如果用户可用任何代币支付交易费用,则可能会威胁到 ETH 的储备地位。EIP-1559 通过强制把 ETH 作为费用代币来缓解这一问题。 EIP-1559 如何工作 升级前的矿工费机制 矿工费 = GasPrice GasUsed GasUsed(gas):交易消耗的总 gas 数量。 GasPrice(gwei):即对单位 gas 的定价,1 gwei= 10^(-9) eth。 采用竞价机制,GasPrice 设置越高,交易处理速度越快。 交易由矿工处理,矿工费完全由矿工收取。 升级后的费用机制 交易费用 = (baseFee + PriorityFee) GasUsed 对比升级前后的公式,可以看出 EIP-1559 是将 GasPrice 拆分成了两个费率的组合:baseFee 和 PriorityFee。 baseFee(基础费用) baseFee 会根据上一区块的空间利用率自动调整,如果利用率超过 50%,则提升当前区块的 baseFee;反之降低。 按照 baseFee 计算公式,相邻区块间的 baseFee 变化幅度在 ±12.5% 之间: 如果上一区块空间利用率为 100%,则当前区块 baseFee 将自动提升 12.5% 如果上一区块空间利用率为 0%,则当前区块 baseFee 将自动降低 12.5% 不同于原来的矿工费机制,EIP-1559 升级后,交易费用不完全由矿工收取,其中 baseFee 将被完全销毁。 PriorityFee(小费) PriorityFee 表示给矿工的小费,延续了竞价设计。如果希望自己的交易在区块中被尽快打包,可通过设置 PriorityFee 激励矿工,矿工将优先处理 PriorityFee 高的交易。 同时,用户还可以自行设置 PriorityFee 的最高值,即付给矿工小费的上限,也叫 maxPriorityFee。 maxFee(最高费用) maxFee 表示用户愿意对某笔交易可支付的最高交易费用。对应到公式中,maxFee = baseFee + maxPriorityFee,其中 maxFee 和 maxPriorityFee 都支持用户自行设置,baseFee 则由算法自动给出。 注:升级后「矿工费」的说法已经不合适了,因为费用中的 baseFee 是要销毁的,只有 PriorityFee 由矿工收取。或许 EIP-1559 升级后,我们应该在以太坊生态中弃用「矿工费」的说法了。 EIP-1559 交易费用计算实例 升级前 矿工费 = GasPrice GasUsed 升级后 交易费用 = (baseFee + PriorityFee) GasUsed maxFee >= baseFee + maxPriorityFee 可能出现的各种费用情况,单位 gwei 如何看待 EIP-1559 EIP-1559 历经了两年的讨论,至今仍然备受争议,对于 EIP-1559 的利弊,社区中有很多严肃深入的思考和讨论,感兴趣的同学可以查看: EIP-1559 提案:EIP-1559: Fee market change for ETH 1.0 chain: https://eips.ethereum.org/EIPS/eip-1559 中文资料汇总:链闻精选 | 读懂以太坊 EIP-1559 提案,它为何备受争议?:https://www.chainnews.com/articles/118999530771.htm 英文资料汇总:EIP-1559 Resources 🔥:https://hackmd.io/@timbeiko/1559-resources EIP-1559 相关工具 https://ethburned.info/ 这个页面统计了 EIP-1559 启动后销毁的 ETH 数量。 https://www.gasnow.org/ 基于 EIP-1559 规则,GasNow 提供了对 baseFee、maxFee 及 maxPriorityFee 的设置建议。 参考资料 Deribit Insights | Analysis of EIP-1559: https://insights.deribit.com/market-research/analysis-of-eip-1559/ Chang-Wu:EIP-1559
  • 以太坊转账教程:一张gif 动图让你看懂

    Vitalik 曾说以太坊就像是一座城市,不同的应用是城市里的建筑。而不同的区块则是城市里的公交车。矿工打包区块,就是让不同的交易上不同班次的车。 DeFi 是城市里最热闹的街区。这里有最大的去中心化交易所 Uniswap,有借贷协议 MakerDAO,还有预言机 Chainlink 等等。最重要的是,这里有熙熙攘攘的人群。 而在繁华的街道上,忍耐拥堵的交通就成为了我们的必修课。如果你想享受到高速的服务,那就需要支付更高的生活成本,在以太坊这座城市里,意味着更高的矿工费。 今天我们就带大家来看看,以太坊网络的一笔交易是如何完成的。 熟悉以太坊的朋友们,可能对 TxStreet 不会陌生。它是一个既实用又有趣的可视化区块浏览器。在这里,区块被形象化为公交车,一笔笔不同的交易,则是不同的卡通小人物来表示。 当我们通过 imToken 发起一笔 Uniswap 交易,就会有一个卡通小人从 Uniswap 的建筑中走出,进到排队的队伍中,等待上车。如果你有急事需要插队,可以通过支付更高的矿工费排到队伍前面,更快上车。以太坊网络每隔 15 秒发一次车,这样一个区块就通过了红绿灯,打包发送出去了。 在排队的人较少时,卡通小人耐心排队,等待几分钟就可以上车了。但在以太坊这座城市,持续涌入的人口不断考验原有的基础交通设施。 等待区块班车的交易 在这张 gif 动图中,你会看到有些卡通小人进入区块公交的同时,还有其他的卡通小人出来,这是为什么呢?这就要提到以太坊的区块大小和转账机制了。 与比特币网络不同,以太坊没有明确地按内存限制每个区块的大小,而是通过区块 GasLimit 强制规定每个区块的大小和一个区块中可以打包的交易量。当前以太坊的区块 GasLimit 是 1200 万 Gas 左右,每一笔交易需要的 Gas 在几万到几十万之间,平均每个区块大概可以打包 200 笔左右的交易。 以太坊矿工的矿工费主要由两部分组成,一部分是挖矿产生的固定区块奖励,另一部分是区块里包含的矿工费。矿工在打包交易的时候,为了收到更多的矿工费,会优先打包支付更高矿工费的交易。而矿工费给的更少的交易,只能继续排队,搭乘后面的公交车了。当你处于继续等待的时候,链上的状态就是「pending」,即「确认中」。 如果你想赶上第一班公交车,在使用 imToken 发起交易时,选择默认的矿工费即可,交易将会被尽快打包。 讲到这里,你是不是已经清楚以太坊转账的机制了呢?如果还有任何关于以太坊转账的疑问,欢迎在下方评论区提问!
  • 以太坊代币入门指南

    什么是以太坊代币? 在学习以太坊代币(Ethereum tokens)之前,有必要先了解以太坊的基本原理。对于刚接触这些概念的人,可以先看我之前写的《以太坊入门指南》。以太坊代币是内置在以太坊区块链上的数字资产。它们受益于以太坊现有的基础设施,而不需要开发者重新构建全新区块链。它们还通过以太币(以太坊的本地货币,被用来驱动智能合约)来加强以太坊生态系统。这份入门指南可以帮助那些数字资产新人从更高的层面了解以太坊代币,以及它们和以太币的区别。 (数据采集于2017年5月22日) 对比 以太坊可以创建任何智能合约,包括可以表示数字资产的智能合约,而这些数字资产被称为以太坊代币。这类似 App Store 是提供 iOS apps 的平台一样,其中部分 apps 会在它们的游戏或平台中发行数字货币。然而,和 Apple 不同的是,以太坊没有中心实体来控制哪些 apps 可以上 App Store,每个人都可以在以太坊上发行代币。 以太坊代币可以用本地货币来表示任何实物,例如黄金(Digix)、用作支付交易费用的本地货币(Golem)。未来,代币甚至可以用来代表股票和债券等金融工具。每个代币的属性和功能完全遵守其预期用途的约束。代币可以有固定的供应量、恒定的通货膨胀率、甚至由复杂的货币政策来决定的供应量。代币可以用作多样化目的,例如支付访问网络,或用作去中心化组织的管理。 代币通常通过初始货币众筹(Initial Coin Offering,ICO)的销售方式进入公众视野。这些代币创建者会通过提供内置代币,来交换以太币、比特币或其他数字资产。近期有非常多的 ICO,在短短时间内改变了项目资金筹集的方式。尽管创建者希望去中心化应用程序中的代币尽可能被更多人拥有,但如何良好分配这些代币并没有限制。 图表来自于 thecontrol.co 现在有很多资料会教你创建新代币的过程,而且它们从技术层面解释了代币的工作原理。例如,代币工厂提供了一个简单的用户界面,允许你使用自定义参数来创建自己的以太坊代币。 类似比特币和以太,这些代币被记录在区块链上,也就是说所有已经发生的交易都被登记在了一个公开分类账本中。这是因为以太坊上的代币只是基于以太坊区块链一种特定的智能合约。 Aragon’s token tracked on Etherscan.io 现在市场上最大的以太坊代币是 Augur’s REP 和 Golem’s GNT。目前两个项目都在开发阶段,总市值 4.5 亿美元。我将简短阐述它们的工作原理,以便大家更好理解以太坊代币中的不同功能。 Augur Augur是由 Joey Krug 和 Jack Peterson 共同创建的去中心化预测市场。该预测市场允许用户下注不同事件的结果,也可以用来对冲。例如,如果你有一枚价值 2000 美元的比特币,而且想对冲持有,你可以打赌比特币的价格在某一天会低于 2000 美元。如果比特币上涨,那么你持有的比特币会更加值钱,如果比特币价格下跌,那么通过该预测市场你将缩小你的损失。这些事件结果的报告并没有中心化来源,所以会降低有一个腐败记者的风险,但也增加了对分散报告的需求。 Augur 发布的以太坊代币称为 Reputation (REP),REP的恒定供应量为 1100 万枚,其中 80%众筹到了 530 万美元,这些代币用于预测市场事件结果的报告。所有活跃的 REP 持有者必须报告随机选择事件的结果,这维护了用来解决 Augur 预测市场结果的去中心化报告池。作为提供这一关键报告功能的奖励,REP持有人可获得平台上预测市场产生的所有交易费用的一半。如果有人试图撒谎或报告错误结果,那么作为惩罚,他们必须放弃所持的一部分 REP。此外,如果大部分 REP 持有者是不诚实的,那么人们将再也不想用 Augur,REP 的价格也会随之下跌。这鼓励人们在 Augur 系统中诚实行事。 Golem Golem是一个由 Julian Zawistowski 领导的项目,它允许人们出租他们电脑的闲置算力。这个想法是通过创建一个全球超级计算机,使得计算能力更加便宜,有更多用户可以使用。 Golem 发行的以太坊代币叫 Golem Network Token (GNT),其恒定供应量为 10 亿枚代币,其中82% 通过众筹获得了 860 万美元。这些代币必须与 Golem 网络配合使用,用来支付算力的租用。由于访问此网络的代币有限,如果有更多的人想使用 Golem,那么 GNT 的价格就会上升。这理论上使GNT的持有者和使用者动机一致。 ERC20 代币 你也许听以太坊社区成员提起过 ERC20 代币。最初的 ERC20页面 “描述了实现代币合约的标准功能”,ERC20 是各个代币的标准接口。ERC20 代币仅仅是以太坊代币的子集。为了充分兼容 ERC20,开发者需要将一组特定的函数集成到他们的智能合约中,以便在高层面能够执行以下操作: 获得代币总供应量 获得账户余额 转让代币 批准花费代币 ERC20 让以太坊区块链上的其他智能合约和去中心化应用之间无缝交互。一些具有部分但非所有ERC20标准功能的代币被认为是部分 ERC20兼容,这还要视其具体缺失的功能而定,但总体是它们仍然很容易与外部交互。 资源 目前已经有很多现有和即将到来的以太坊代币。下面是一些能帮助你更好地理解以太坊代币的链接,同时有最及时和让人兴奋的新闻。 理解以太坊代币 应用虚拟币和协议代币的区别(https://medium.com/0x-project/the-difference-between-app-coins-and-protocol-tokens-7281a428348c) 如何使用代币在区块链上筹款(https://blog.gdax.com/how-to-raise-money-on-a-blockchain-with-a-token-510562c9cdfa) 区块链代币证券法律框架介绍(https://blog.coinbase.com/2016-12-07-blockchain-token-securities-law-a66ef03c383f) 代币、代币、更多的代币(https://thecontrol.co/tokens-tokens-and-more-tokens-d4b177fbb443) 代币经济(https://thecontrol.co/the-token-economy-81becd26b9de) 完美的代币销售结构(https://blog.gdax.com/the-perfect-token-sale-structure-63c169789491) 以太坊代币最新消息 ICO Alert(https://www.icoalert.com/) Smith + Crown(https://www.smithandcrown.com/) Ethereum Subreddit(https://www.reddit.com/r/ethereum/) The Control(https://thecontrol.co/) Week in Ethereum News(http://www.weekinethereum.com/) The Dapp Daily(https://dappdaily.com/)
  • 理解ERC-20 token合约

    这周(译者注:原文发表于9月15日)的早些时候,ERC-20 token接口正式成为了改进协议,明确了其定义。这篇文章会简单介绍各种符合ERC-20标准的token,解释ERC-20的特征和功能,以供读者了解什么是token合约,以及开发者应该如何使用该标准。 ERC-20最初作为一种尝试,旨在为以太坊(Ethereum)上的token合约提供一个特征与接口的共同标准,并且,它现在已经被证明是非常成功的了。ERC-20有很多好处,包括允许钱包显示数以百计不同token的账户余额;创建一个交易工具,只需提供token合约的地址就可以将更多token列入表中。创建ERC-20兼容token的好处很多,以至于在今天,很少有其他token合约用其他方式创建。 Token合约是什么? 现在仍存在着大量关于“token合约到底是什么”的争论。本质上来说,一个token合约就是一个包含了一个对账户地址及其余额的映射的智能合约(Smart Contract)。账户余额表示一种由合约创建者定义的值:一个token合约也许使用余额来表示物理对象,或是表示另一种货币价值,还可以表示持有人的名誉。余额的单位通常被称为token。 当token从一个账户被转移到另一个账户的时候,token合约更新两个账户的余额。比如,一笔从 0x2299…3ab7 到 0x1f59…3492 的10个token的转账将导致余额列表如下图所示进行更新: 如果该token合约允许的话,变更一种token的总供给可能有两种办法。token的总供给可以通过铸造新token来增加。举个例子,铸造出100个token到地址 0x4ba5…ae22 将导致余额如下图所示进行更新: 销毁token的另一种方式是将token发送到一个未创建私钥的地址,通常来说就是0地址。这会使得这些token不可用,在这方面,它与销毁token有同样的效果,但并没有减少token的总数。比如, 0x93f1…1b09 用此种方式销毁了50个token将导致如下图所示的余额: 简单的token合约在一个从地址到余额的映射中保存上述信息。当更多复杂的情景出现时,比如发放股息,替代性结构或者增补性结构常常要变得更强悍。但是,不管那些操作上的细节的话,对外部可见的token余额总是像上面的图示那样的。 一个ERC-20 token合约的定义 一个ERC-20 合约是通过合约的地址以及它可用的token总供给来定义的,但它通常还提供一些非必须的东西,也是为用户提供更多细节。它们包括该token的名字、标志、小数位。这些中的每一个都会包括在下面的细节中。 在深入到细节之前,理解这件事情是重要的:token合约没有一个中心化的登记处,因此无法保证特定名字和符号的唯一性。一旦你已经创建了一个token合约,你应该请求将它加入公共站点,比如:Etherscan,MyEtherWallet 以及 CoinMarketCap。当然,确保符合网站上的说明可以最大化你的申请被接受的机会。 Token合约的名字乃是该token合约应该被知道的完整名称,比如“My Token”。名字的长度没有限制,但完整名称在一些钱包应用中更容易显示不完全,所以,最好让名字短一点。 Token合约的标志乃是该token合约应该被知道的符号,比如“MYT”。广义上,它是股票代码的对应物,而且,虽然没有严格的长度限制,但它在长度上常常是3或4个字母。 小数位常常是混淆的来源,但经过合理的解释这是非常容易理解的。小数位意味着一个token的可切分性,从0个小数位(即完全不可切分)到18位小数(几乎是连续的),如果需要,可以有更多的小数位。从技术上来说,小数位的意义在于显示token价值在屏幕上的时候小数点后面跟着的位数。小数位存在的理由是以太坊并不处理有小数的数字,只显示整数的数字价值。考虑下面两个例子: 第一个例子是LicenseToken,一个为给定软件产品显示软件许可分配的token合约;持有一个LicenseToken,使用者就可以使用该软件。而持有小于1个的LicenseToken则没有任何意义,所以token创建者将小数位设为0。一些LicenseToken的持有人账户余额如下。 可以看到,在这里有100份许可,主要被一个账户所持有。当用户购买一份许可的时候,一个token将从持有账户转账到购买者账户。而许可验证者可以查看一个特定的账户是否真的持有一个LicenseToken,然后做出相应的行动。 第二个例子是GoldToken,一个表示物理黄金所有权的token合约。合约创建者希望每单位表示1千克黄金的单位,但同样希望允许用户以克的级别(但不能更低)持有和交易黄金。因为以太坊并不支持小数因此1个token必须表示1克黄金,以及,为了向外界表示1000克作为单一的1Kg单位,小数位要设置成3(因为 10^3 克也就是1千克黄金才是token合约创建者希望显示为1token的单位)。一些GoldToken的持有者可以用图像表示在下方。 在这里你可以看到总共有50Kg的黄金被表示出来(每token 1克乘以50,000个token)。 但是,如果小数位被设成3,用户的情形就会像下面这样: 可以看到,将小数位设置成3在字面上就意味着在显示GoldToken余额的时候,应该有3位数跟在小数点后面。 小数位经常被称为是一个人性化的元素,因为它允许token合约定义他们希望余额怎样显示给用户。GoldToken并不在内部处理小数位,也从不将小数位用在它自己的计算中因为一切都是用克来计算的,但它允许用户使用黄金的共通单位(千克)而不是在合约中使用的单位(克)。 正如在上述GoldToken中显示的,可切分性的观念允许token合约显示非常小的小数值,并且token也常常把小数位设成18,以给予token一个近乎连续的价值范围。 总结一下,在决定要取几个小数位时,下述规则是应该被遵循的: token合约表示的是一个不可切分的物体吗?(如果是)那么将小数位设为0 token合约表示的是一个有特定小数位的物体吗?那么将小数位设置到那个数字 如果上述两者都不是,请设置小数位为18 重要的是要知道小数位对合约创建的影响。被创建的Token数量应该等于token的全部数量,要求是10^小数位的倍数。正如在GoldToken例子中可以看到的,token创建者希望创建token来表示50千克的黄金,但因为3位小数,他们必须发行50,000 token(50×10^3)来做成这件事。 总供给是定义一个ERC-20 token合约的最后一个东西,并且,正如我们提到过的,它是唯一的强制参数。虽然在ERC-20说明书中并没有明确提到,但总供给的概念是简单的:总供给等于所有余额的和。上面的例子中一直显示着总供给,所以这里就无需赘述了。 一个ERC-20 token合约的功能 ERC-20 token合约拥有一系列的功能,允许用户发现用户的余额,也允许余额经过验证从一个账户转账到另一个账户。下面来描述一下这些功能。 balance()函数提供了被一个给定地址持有的token的数量。记住,任何人都可以查到任何地址的余额,正如所有数据在区块链上都是公开的。 从一个地址发送token到另一个地址有两种办法。tranfer()函数可以从信息发送者那里直接转一些token到林一个地址。记住,人们不会查验接收地址,因此确保接收者按预期的方式行动是发送者的责任。 虽然用transfer()来发送toke给另一个用户是很棒的,但当token要被用来为一个智能合约中的函数进行支付的时候,它就起不了作用了。这是因为,当智能合约运行的时候,它没办法获得哪个地址转账到哪里的细节,因此也就无法保证调用这个合约的用户已经支付了启动合约要求数量的资金。 想象一下,有一个合约Doer被部署在网络上。Doer拥有一个函数dosomething(),它要求10 Do token来运行。Joe希望调用dosomething(),也有50Do token在他的账户上。Joe怎样能够支付给Doer以致后者可以成功运行dosomething()呢? approve()和transferFrom()是两个方程,它们使用一个两步过程,可以解决上面的问题。第一步,一个token持有者给另一个地址(常常是一个智能合约)批准从本地转出一个最大特定数量的token,也就是所谓的配额(allowence)。Token持有者使用approve()来提供这些信息。 在上述例子中,第二行显示,地址为 0x1f59…3492 的Joe已经允许地址为 0xd8f0…c028 的Doer从Joe的账户中转出25个token。 一旦一个许可被创建,智能合约就可以从一个用户的配额中占用许可数量的token,作为该合约运行的一部分。继续这个例子。Joe现在可以调用dosomething(),而dosomething()可以使用transferFrom()以从Joe的账户中获得10个Do token, 然后开始它的工作。如果Joe的账户上没有10个token,或者配额低于10个token,dosomething()就会当机。 allowance()函数提供了允许从一个给定地址提取到另一个给定地址的token的数量。记住,任何人都可以查到任何地址的余额,正如所有信息在区块链上都是公开的。重要的是知道,配额是“软性”的,因为所有单独的或者累积的配额可以超过一个地址的余额。在上面展示的表格中,持有者 0x2299…3ab7 许可了最高500个token的转出,但他的余额,如上所示,只有90个token。任何使用allowance()的合约,在计算可用的token数量的时候,都必须额外考虑用户的余额。 一个ERC-20 token合约中的事件 ERC-20定义了在合约采取了相关行动的时候,两类事件是必须被触发的。第一类事件是Transfer(),就是放出从一个地址转移到另一个地址的token转移的细节。第二类事件是Approval(),就是放出从一个地址许可转移token到另一个地址的细节。这些可以被用来跟踪地址余额和配额的变更,而无需查询区块链。 铸造token会发出了一个带有o地址的Transfer()事件作为源。 当token被销毁的时候,没有事件会发出。因为这一点,ERC-20 token 合约常常通过transfer()发送token到0地址来销毁token,代替真正的销毁。 超越ERC-20 ERC-20提供了一个良好的基础来构建token合约,但也并不是没有问题。ERC-223协议提供了额外的特性和安全措施,但与ERC-20并不兼容。Token合约的建构在今天还要继续遵循ERC-20,而开发者应该跟踪 ERC-223协议,并为它做出贡献。
sitemap