作者:NEST愛好者_CryptoV12

有關「授權」操作,很多以太坊新用戶在第一次操作智能合約遇到時都是一頭霧水。不明白什麼是授權,更不明白為什麼授權還要發起一筆交易,而且交易本身沒有攜帶任何資產,同時還要去支付一筆礦工費。

本篇文章,我們將從技術的角度為大家解讀一下「授權」操作的本質。

用戶在與以太坊智能合約進行Token 資產交互時,首先要進行授權(approve)操作。那麼,為什麼要有授權操作呢?

科普 | 以太坊合約交互中的“授權”究竟是什麼?

我們舉一個NEST 預言機礦工報價的案例:

  1. Bob 是一名NEST 預言機報價礦工,他在參與ETH/USDT 價格預言機報價時,需要按照自己的報價數據往報價合約中同時轉入ETH 和USDT 資產,這裡假設是10 ETH 和1600 USDT,去進行一次報價操作。

  2. 那麼Bob 首先要將USDT 資產進行一次授權操作,授權給NEST預言機的報價合約,讓報價合約擁有操作Bob 錢包中USDT 資產的權限,以便在報價生命週期內有驗證者吃單時順利執行涉及到USDT 資產的交易邏輯。

  3. 這裡的授權本質上也是一筆鏈上交易,需要用戶支付礦工費(Gas費)。目的是為了告訴USDT Token 合約,目標智能合約A 擁有支配我錢包X 數量USDT 資產的權限。然後,當目標合約A 內需要去進行USDT 交易的時候,它就會主動去從USDT Token 合約中獲取不高於X 數量的USDT 資產。

但在上面這個案例中又出現了另一個疑惑,為什麼在報價過程中,只有USDT 這類的ERC20 Token 需要進行授權操作,而ETH 不需要呢?

技術解析:因為ETH 作為以太坊網絡原生資產,在向目標智能合約轉賬時,以太坊網絡底層強制要求目標合約要有確定的接收方法,所以交易本身可以攜帶ETH 資產到目標合約中;而ERC20 Token在向目標合約轉賬時,只是更改ERC20 Token 合約本身的賬本信息,目標合約不會收到任何通知。

所以,ETH 在與智能合約進行價值交互時不需要像ERC20 Token 那樣進行授權操作。

準確來說,授權操作有2 步:

第1 步:授權交易本身。是為了告訴某ERC20 Token 合約,將來可能會有目標智能合約地址A 來我的錢包賬戶取走X 數量的該Token 資產;

第2 步:交易執行本身。當目標合約A 中的邏輯執行需要進行該Token 交易時,合約A 會去主動去觸發ERC20 Token 取走X 數量的該Token 的轉賬交易;反之,如果沒有涉及到該Token 的交易,即使已經授權了,也不會真實發生資產交易。

簡而言之,授權操作之後,不一定會執行Token 交易,只是對目標合約A 保留了這樣一個資金操作權限。

科普 | 以太坊合約交互中的“授權”究竟是什麼?

很多智能合約開發者為了避免用戶反復進行授權操作,一般會默認設置授權最大數量的Token 給到目標智能合約。很顯然,這種處理方式是存在一定風險的,如果智能合約出現漏洞或合約管理員作惡,那麼用戶的Token 資產將存在丟失的風險,這就是「過度授權」帶來的問題。

無論是在NEST DAPP 中還是imToken 錢包中,我們都會經常遇到這個問題。

科普 | 以太坊合約交互中的“授權”究竟是什麼?

為了解決「過度授權」的問題,NEST DAPP 設有授權管理頁面,如果礦工自己預期短時間內不會參與NEST 預言機報價,那麼他可以進行「取消授權」操作,消除已有授權所帶來的安全問題;imToken 錢包也採取了一些措施,比如每次授權都會“明確授權信息”,以及設有授權管理專有DAPP,讓用戶自由管理自己的已有授權。

跳過授權操作的可行性方案:通過在ERC20 Token 合約中實現特定的轉賬邏輯,即轉賬的同時強行調用目標合約的一個方法,可以避免現在的授權操作。但是為了保持Token 合約的純粹性,主流ERC20 Token 並沒有實現該功能。

參考資料:

1、imToken 如何應對DApp 過度授權問題?

https://mp.weixin.qq.com/s/c-_Lt8TuIqrgbK4fmmKT2A

2、NEST 去中心化價格預言機綜述:

https://www.nestfans.com/wiki/nest_introduction