作者:NEST愛好者_CryptoV12
有關「授權」操作,很多以太坊新用戶在第一次操作智能合約遇到時都是一頭霧水。不明白什麼是授權,更不明白為什麼授權還要發起一筆交易,而且交易本身沒有攜帶任何資產,同時還要去支付一筆礦工費。
本篇文章,我們將從技術的角度為大家解讀一下「授權」操作的本質。
用戶在與以太坊智能合約進行 Token 資產交互時,首先要進行授權(approve)操作。那麼,為什麼要有授權操作呢?
我們舉一個 NEST 預言機礦工報價的案例 :
Bob 是一名 NEST 預言機報價礦工,他在參與 ETH/USDT 價格預言機報價時,需要按照自己的報價數據往報價合約中同時轉入 ETH 和 USDT 資產,這裡假設是 10 ETH 和 1600 USDT,去進行一次報價操作。
那麼 Bob 首先要將 USDT 資產進行一次授權操作,授權給NEST預言機的報價合約,讓報價合約擁有操作 Bob 錢包中 USDT 資產的權限,以便在報價生命週期內有驗證者吃單時順利執行涉及到 USDT 資產的交易邏輯。
這裡的授權本質上也是一筆鏈上交易,需要用戶支付礦工費(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 過度授權問題?
2、NEST 去中心化價格預言機綜述
閱讀更多 Odaily星球日報 的文章