Solidity

你如何從另一個合約的函式中獲取事件?

  • February 20, 2017

我有兩個契約:

// contract #1
contract eXample {
// intizializer 
 function eXample{
  .....
 }
//creating the Event
 event MyEvent(uint x,uint y,uint z);
 function doSomething{
   .....
// calling the event inside doSomething function
  MyEvent(x,y,z);
 }
}


contract contractCaller {
 ....
// creating an instance of contract #1
 eXample instance = eXample(address)
// calling fonction from contract #1 inside contract #2 method.
 function exampleFunction{
   instance.doSomething
 }
 // everytjing inside eXamplefunction is working. Everything inside instance.doSomething IS working. Only issue is the Event not triggering.
 ....
}

我在“contractCaller”中使用“eXample”中的函式一切正常,但只有一件事。當從第二個合約呼叫 instance.doSomething 時,我沒有從區塊鏈上的 mix/ 中的第一個合約返回任何事件。顯然我有觀察者等。

正常嗎?我應該在我的第二份契約上為第一份契約的功能製作自定義事件嗎?

大家平時是怎麼進行的呢?

編輯更好的例子,因為我搞砸了第一個:

contract metaCoin { 
 mapping (address => uint) public balances;
 function metaCoin() {
   balances[msg.sender] = 10000;
 }
 event ExampleEvent(uint x);
 function sendToken(address receiver, uint amount) returns(bool successful){
   if (balances[msg.sender] < amount) return false;
   balances[msg.sender] -= amount;
   balances[receiver] += amount;
   ExampleEvent(balances[receiver]);
   return false;
 }
}

contract coinCaller{
 function sendCoin(address coinContractAddress, address receiver, uint amount){
   metaCoin m = metaCoin(coinContractAddress);
   m.sendToken(receiver, amount);
 }
}

呼叫 CoinCaller.Sendcoin 時。即使在 MetaCoin 合約上有觀察者,ExampleEvent 也不會觸發。

好的。現在。您的事件應該以可靠的方式記錄,但您必須在 JS 中呼叫該事件才能訪問記錄的資訊。在 web3 api 中有一個完整的部分介紹這些內容。 https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

msg.sender是目前呼叫的發送者。

tx.origin整個呼叫鏈的發送者

在 metaCoin 範例中,您應該使用tx.origin.

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