Transactions

呼叫函式一種一種A這反過來又呼叫了一個函式乙乙B從另一個契約

  • February 20, 2022

我有兩個契約,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。這就是我需要的

https://www.youtube.com/watch?v=uawCDnxFJ-0

障礙:

沒有人可以創建從別人錢包中支出的合約。當兩個契約來自同一作者時,此規則不會改變。

解決方案:

兩個合約之間存在信任關係。Domain 不能從 Serial 的錢中支出,但 Serial 可以為特定目的向 Domain 提供資金,並期望將未使用的資金返還。

“這是 10 美元。去商店給我買____,如果他們有的話,把我的零錢拿回來。” - 編寫域功能中的規則。

你會看到錢從串列到域,然後返回(它說“有條件”)。它可能會讓您重新考慮如何模組化您的應用程序。在這種情況下,關鍵是每個人都必須從手頭的資金中支出。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/101653