Transactions
呼叫函式一種一種A這反過來又呼叫了一個函式乙乙B從另一個契約
我有兩個契約,
Domain
分別Serial
部署。注意:為簡單起見,省略了大部分程式碼。
contract Serial { Domain DOMAIN; //Domain contract is imported and set by another function function payToSerial(string memory serialNumber, unit amount) public { address toAddr = serialToAddress(serialNumber) //We convert serial number to a valid address DOMAIN.transfer(toAddr, amount) //Use transfer() from *Domain* contract } } contract Domain { function transfer(address recipient, uint256 amount) public { //does transfer under specific conditions, } }
當我從合約中呼叫transfer()
Domain
時,它可以工作,將資金從我的錢包發送到我指定的任何地址。但是,當我呼叫payToSerial()函式時,該函式又從合約呼叫transfer()
Domain
函式(如程式碼所示),交易失敗,因為它試圖從Serial
合約地址而不是我的錢包發送資金。有沒有辦法修改**payToSerial()**函式來解決這個問題?
//
//
//
我試圖編輯**payToSerial()**來完成它(到固有的 msg.sender),但它沒有用。
function payToSerial(string memory serialNumber, uint amount) public { DOMAIN = Domain(msg.sender); address toAddr = serialAddresses[serialNumber]; DOMAIN.transfer(toAddr, amount); }
我不確定我想要做的事情是否可能,但無論如何我都想問。
更新:我發現這個教程影片解釋了 Solidity 0.8 的 Delegatecall。這就是我需要的
障礙:
沒有人可以創建從別人錢包中支出的合約。當兩個契約來自同一作者時,此規則不會改變。
解決方案:
兩個合約之間存在信任關係。Domain 不能從 Serial 的錢中支出,但 Serial 可以為特定目的向 Domain 提供資金,並期望將未使用的資金返還。
“這是 10 美元。去商店給我買____,如果他們有的話,把我的零錢拿回來。” - 編寫域功能中的規則。
你會看到錢從串列到域,然後返回(它說“有條件”)。它可能會讓您重新考慮如何模組化您的應用程序。在這種情況下,關鍵是每個人都必須從手頭的資金中支出。
希望能幫助到你。