Solidity
限制僅從一個帳戶付款
我是乙太坊 DApp 開發的初學者,我正在 Remix IDE 中測試我的合約。我的問題是我可以限制一個帳戶來支付我的應用程序上發生的所有交易,因為我不希望我的應用程序使用者支付交易費用,因為這將要求每個使用者都必須有一些像 MetaMask 這樣的錢包或安裝霧。這種方法是否正確,這可能嗎?我該如何實現呢?
正如 Jesse Busman 在評論中提到的,這還不能直接在智能合約中實現。但是您可以嘗試註冊所有支付的交易費用和地址(通過事件),以便稍後退還地址列表。
可以使用元交易。
大體構想如下:
- 使用者簽署交易。這本身不需要gas,嚴格來說,不需要metamask或任何其他“錢包”。您的應用程序可以處理它,還可以為您的使用者發佈公鑰/私鑰對和 ETH 地址,以便從使用者的角度來看,“它可以正常工作”。
- 由於發送交易需要gas,因此必須有人去做,而那個“某人”確實會為gas付費。但是,重要的是,發送者不必是簽名者。使用者將簽名的交易、鏈下交易(例如 HTTP(s) POST)傳輸給其他人,如 Austin 在影片中所說的那樣,稱為“轉發器”或“保鏢”。轉發器可能是您的伺服器,甚至是願意這樣做的公共設施。他們使用該消息作為數據發送交易。
- 轉發器/保鏢發送帶有氣體的交易。接收合約需要精心設計以預期元交易 -
msg.sender
始終是轉發器,但探勘已簽名的有效負載以發現誰使用ecrecover
.- 這個過程的一個可選變體是,如果簽署的交易是為了支付他們的麻煩而支付的契約,則可以用代幣或 ETH 補償貨運代理。
總之,Alice 向 Bob 發送了一條簽名消息。Bob 在來自 Bob 的交易中中繼 Alice 的簽名消息(作為參數),因此 Bob 支付 gas。接收者通常是一個合約,它解包簽名的消息,驗證 Alice 的簽名,並可能補償 Bob 傳遞它的費用。
有些實現細節需要整篇博文才能解開。可以說這不是一個易於部署的模式,但它是可行的。該影片技術含量不高,但可以讓您了解它的外觀或幫助您集中 Google-Fu。
https://www.youtube.com/watch?v=6r3SqCcEVU4
希望能幫助到你。