contract DAI { [略] function transferFrom(address src, address dst, uint wad) public returns (bool) { [內容略] } function approve(address usr, uint wad) external returns (bool) { [內容略] } [略] } contract DAI_meta { function transfer_meta(string memory metaMessage, r,s,v) { digest = [依照 EIP712 規定打包 metaMessage] address signer = ecrecover(digest, r,s,v) require( [某種檢查機制確認本合約 & 錢包願意幫 signer 代付 gas 以及 relay metaMessage] ) 接下來有兩種方案 方案一:// 不允許 meta-meta transaction require (signer == msg.sender) [解析 metaMessage 內容,萃取目標 method] [代 signer 呼叫 DAI 裡的目標 method] 方案二:// 允許 meta-meta transaction [解析 metaMessage 內容,萃取目標 method] [代 signer 呼叫 DAI 裡的目標 method] 解法完畢。兩個 follow-up 想法: 1. 似乎可以 propose 新的 EIP 建議「如何 structure metaMessage」以及「從 metaMessage 裡將目標 method 萃取出來的方式規格化」 2. 以上解法即是要求:如果一個 dapp 的 contract X 裡有 method 希望能被 meta-enabled,則 dapp 必須推出一個配套的 contract X_meta 負責解析 & 有條件的代付 gas。 } }
0.4.18