Contract-Development

使用參數動態呼叫事件

  • February 19, 2018

如何動態呼叫帶有名稱的事件?例如,我的合約有一些事件,根據某些條件,我想呼叫其中一個。我不想使用 switch 或 if 語句,但想指定事件的名稱並用數據呼叫它

我嘗試了以下簡單範例,但沒有成功。

event StoredValue(
  string data);

function callEvent(string eventName, data) {
this.call(bytes4(sha3("StoredValue(data)")));
}

我想將名稱和參數傳遞給將用於呼叫事件的函式

事件不是函式,因此您必須將它們包裝在函式中以完成此操作,而是傳遞函式名稱,例如:

modifier onlySelf(){
   require(msg.sender==this);
   _;
}

event EventOne(string data);
event EventTwo(string data);

function logEventOne(string data) public onlySelf{
   EventOne(data);
}

function logEventTwo(string data) public onlySelf{
   EventTwo(data);
}

function callEvent(string functionSignature, string data){
   this.call(bytes4(sha3(functionSignature)),data);
}

請注意,由於this.call將創建消息呼叫,因此您呼叫的函式必須是公開的才能工作。為了繞過它們是公開的這一事實,我添加了onlySelf修飾符,因此只有合約可以呼叫它們。

我建議不要這樣做,因為無論如何事件必須在編譯時存在,因此您可以直接執行 EventOne/EventTwo 而不是動態執行。

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