1. 首页
  2. 名家说

文组也该知道的区块链技术知识 为何发送 ERC20 Token 需要两次交易?

本文作者为赖彦廷,于区块链解决方案服务商 Pelith 沛理科技担任专案经理,本系列文章并不会谈到太深的技术钻研,而是以深入浅出的方式,让每一个想要了解区块链技术的读者,都可以在读完后说出:原来如此!

 

为什么发送 ERC20 Token 给别人需要两次交易?

许多人可能对此感到疑问,透过本篇文章相信能充分为您解惑。上一节我们带大家一窥以太坊的架构全貌并为迄今为止七篇文章做了小结。我们将在这基础之上阐明发送 ERC20 Token 背后的技术解析。

发送以太币

发送以太币时其实蛮符合我们的直觉,就是把钱发给别人,别人收到这样。然而发送 ERC20 代币却仿佛不是这么单纯,为什么呢?

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
EOA 互动(发送 ETH

ERC-20 代币的本质

首先回顾一下 上一节 提到的,ERC20 代币只是用 ERC20 之智慧合约底下的记忆体来储存记录各个地址持有数量的帐本。既然对象是个智慧合约,就要再回顾一下 第二节 提到的,个人帐户(Externally Owned Account, EOA)与 合约帐户(Contract Account)的不同,由于智慧合约没有主观意识,动作皆需要由 EOA 发交易来触发。因此当合约地址收到 ETH 外的其它代币时,它并不会知道。因为更动的是「另一个智慧合约底下的记忆体」

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
EOA 与 合约帐户

我们实际来看一个范例:

假设我想要透过去中心化交易所 Uniswap 将我持有的 82 颗 cDAI 兑换成 0.0092 颗 ETH,在技术上是如何做到的呢?

先备知识:cDAI 是我将 DAI 存入 Compound 放贷后,Compound 发回给我的 ERC20 Token。所以 cDAI 是由 Compound 管理的 cDAI 智慧合约底下之记忆体(帐本)来记录追踪的。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Uniswap 的 Token Swap 介面

我的 Token Swap 需求在常规逻辑上是:
我把我的 cDAI token 发送给 Uniswap,Uniswap 把 ETH 发送给我。

不过事情并非这么单纯。由于 Uniswap 是去中心化,由智慧合约来运作的。因此当 Uniswap 收到了 cDAI token 时,它不像人一样可以点开 Metamask 去查看是否有收到,确认有收到后再把 ETH 发送给我,因此需要用特殊的做法来实现这样的流程。

我们就直接开门见山讲答案

用比喻来说明的话,做法是:

  1. 我先到 银行(ERC20 Token 的智慧合约)开启 授权
    允许 对方(第三方智慧合约)能够到我的户头
    提取 钱(ERC20 Token),并设定「能够提取的额度」
  2. 接着我开给对方一张「写上金额的支票」
    让对方拿着支票到 银行 中提领我帐户中的 钱。

因为对象(智慧合约)是一段程式码,如此做法方能 让智慧合约确认提取到 Token 并执行后续的合约逻辑操作。

因此,回到区块链的世界,必须透过以下两个交易步骤来进行:

Tx1: Approve(授权)

我必须先发一笔交易到「Compound cDAI Token 智慧合约」(银行),
授权「Uniswap 的 cDAI to ETH 交易对智慧合约」(对方)
可以到「Compound 的 cDAI Token 智慧合约」
(银行)
提取我的「cDAI Token」(钱)

Tx2: Swap Token(兑换)

随后,我再发送一笔「将 cDAI 兑换为 ETH」的交易(支票)
到「Uniswap 的 cDAI to ETH 交易对智慧合约」(对方)触发,
让「Uniswap 的 cDAI to ETH 交易对智慧合约」(对方)
至「Compound 的 cDAI Token 智慧合约」(银行)
提领我的 82 颗「cDAI Token」(钱)。
「Uniswap 的 cDAI to ETH 交易对智慧合约」(对方)提领到 Token(钱)后再将 0.0092 颗 ETH 发送给我。

如下方示意图所示:

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Tx2: Swap Token(兑换)

接着我们带大家实际走一次操作流程以搞懂背后技术逻辑。


Tx1: Approve(授权)

首先,当我们来到 Uniswap 交易所,选好 Input 与 Output 的加密货币种类并在 Input 输入欲兑换的数量,便可以在我欲兑换成 ETH 的 cDAI Token 旁边看到「Unlock」的按钮。这就是要求我进行「Tx1:授权」的操作。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Uniswap

点选「Unlock」按钮后,便会跳出「批准」的交易来让我签署。一但签署后,我便批准了 Uniswap 能够到 Compound 提领我的 cDAI 的权限。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Metamask

这笔交易被确认后,我们便可以凭 Txn Hash 到 Etherscan 上找到这笔交易。可以发现这笔交易是发给「Compound 的 cDAI ERC20 Token 智慧合约」

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Etherscan

点进去这笔交易后,便可以看到呼叫的正是 approve 的 function。我同意了「Uniswap 的 ETH-cDAI 交易对」合约地址能够来提领我的 cDAI,而授权的提领金额量为「最大」

可能会有些人好奇为什么不把 amount 设成我要兑换的量:82 就好。原因是为了便利于未来提领操作时不用再次授权,通常呼叫智慧合约的 approve 函式时都会预设为开启最大值,这样未来再次需要提领时就不用再次进行 approve 的操作。

然而要注意的部分是:针对「可能存在漏洞或不被信任的智慧合约」,若是仍按照预设将权限开至最大值,则将面临 Token 遭到窃取的风险。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
同意「Uniswap 的 ETH-cDAI 交易对」合约地址能够来提领我的 cDAI,而授权的提领金额量为「最大」

在完成「Tx1:Approve 授权」后,便可以看到「Unlock」的按钮消失,并且「Swap」按钮已能够点选。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
「Swap」按钮已能够点选

Tx2: Swap Token

接着便能够来进行将我的 cDAI 兑换成 ETH 的 Swap Token 动作。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Swap Token

同样透过 Metamask 来签署完成这笔交易后,我们到 Etherscan 上追纵这笔交易:能够发现这笔交易是从我的钱包发送给「Uniswap 的 ETH-cDAI 交易对 智慧合约」

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Uniswap 的 ETH-cDAI 交易对 智慧合约

点进去这笔交易后可以看到在这笔交易中执行了两件事:

  1. 将 82 cDAI 从「Compound 的 cDAI 智慧合约」转至 「Uniswap 的 ETH-cDAI 交易对合约地址」中。
  2. 将 0.0092 ETH 从「Uniswap 的 ETH-cDAI 交易对合约地址」中转给我。
文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Uniswap 的 ETH-cDAI 交易对合约地址

接着我们可以在「Uniswap 的 ETH-cDAI 交易对合约地址」的
「Internal Txns」中看到 0.0092 ETH 转移至我的钱包地址;以及
「Erc20 Token Txns」中看到 82 cDAI 从「Compound 的 cDAI 智慧合约」转移至「Uniswap 的 ETH-cDAI 交易对合约地址」中。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
Erc20 Token Txns

同时,这笔交易在「Compound 的 cDAI 智慧合约」中也可以查看到 82 cDAI 被转移出的记录。

文组也该知道的区块链技术知识  为何发送 ERC20 Token 需要两次交易?
82 cDAI 被转移出的记录

结论

  1. 发送 ETH 与 发送 ERC20 Token 给智慧合约有本质上的差异。ETH 是 push-based,单纯把 ETH 发过去就可以。ERC20 Token 的发送则是 pull-based,让合约去主动提取 Token。
  2. 必须先发送一笔交易至 ERC20 合约进行 授权(Approve),允许某合约地址能够至 ERC20 智慧合约提取我持有的 ERC20 Token。
  3. 再发送一笔交易来触发合约地址进行 提取 ERC20 Token 与后续的逻辑操作。

至此,相信读者都已充分理解发送 ERC20 Token 给智慧合约背后的技术逻辑。

下一节我们将来介绍「Oracle(预言机)」,这个扮演 真实世界与区块链间桥梁 的技术,并带大家认识 MakerDAO、Compound 等大专案的实作方式。敬请期待!

以上若有任何

A. 不够清楚的地方
B.
撰写上改进的建议
C.
希望我能够撰写分享的区块链技术知识内容

本文来源于互联网:文组也该知道的区块链技术知识 为何发送 ERC20 Token 需要两次交易?

原创文章,作者:比特币区块链日报,如若转载,请注明出处:https://www.dailybtc.cn/%e6%96%87%e7%bb%84%e4%b9%9f%e8%af%a5%e7%9f%a5%e9%81%93%e7%9a%84%e5%8c%ba%e5%9d%97%e9%93%be%e6%8a%80%e6%9c%af%e7%9f%a5%e8%af%86-%e4%b8%ba%e4%bd%95%e5%8f%91%e9%80%81-erc20-token-%e9%9c%80%e8%a6%81/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:[email protected]

工作时间:周一至周五,9:30-18:30,节假日休息

QR code