Calldata

如何呼叫需要字元串 calldata 作為輸入參數的函式?

  • October 16, 2022

我有一個函式,它有一個輸入參數作為字元串呼叫數據。我不知道如何將字元串傳遞給這個函式。簡單的解決方案給了我一個編譯錯誤,因為它無法將 string_literal 轉換為類型字元串呼叫數據。如果可能的話,我不想更改函式 f 的簽名。如果您有任何想法,請幫助我。

constructor(uint160 _magic) {
   f("abcde");
}

function f(string calldata s) public allow {
   emit FF(s);
}
pragma solidity 0.8.7;

contract Test {
   constructor(uint160 _magic) {
       this.f("abcde");
   }

   function f(string calldata s) external {
   // emit FF(s);
   }
}

這行得通。您需要external可見性並使用 f 呼叫this.f("abcde")。我註釋掉了該emit事件並刪除了allow修飾符並在 Remix 上進行了測試。

  • 接受 calldata 的函式必須在外部呼叫。Calldata 是只讀的,通過區塊鏈呼叫生成。
  • 合約可以通過呼叫 as 在外部呼叫自己this.f("abdce");
  • 在建構合約時,您不能對您的某個函式進行外部呼叫。因為,this在將合約寫入區塊鏈並為合約生成地址之前,合約是未知的。
  • 我可以建議實現另一個函式,this.f("abdce");該函式在部署合約後呼叫並呼叫該函式一次。不要忘記製作它,onlyOwner或者您可以將其實現為只執行一次。

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