Solidity
你如何從另一個合約的函式中獲取事件?
我有兩個契約:
// 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
.