Solidity
擷取從另一個合約呼叫的合約觸發的事件
我正在嘗試計算任意項目/價值的稅。為此,我使用了一份契約作為“Oracle”從外部系統獲取稅款。該合約定義了要從其他合約呼叫的函式,並將發出一個由外部程式碼擷取的事件。然後這將執行計算並將數據發送回合約。程式碼是
pragma solidity ^0.4.21; contract TaxContract { address public owner; event TaxRequest(int price); constructor() public { owner = msg.sender; } function calculateTax(int price) public { emit TaxRequest(price); } }
呼叫合約在其建構子中傳遞了 TaxContract 的地址。
pragma solidity ^0.4.21; import "./TaxContract.sol"; // Asset Test Contract contract AssetContract { address public owner; address contractAddress; // Constructor constructor(address taxContractAddress) public { owner = msg.sender; contractAddress = taxContractAddress; } // Public functions function sellAsset(int price) public { TaxContract(contractAddress).calculateTax(price); } }
我正在使用 Nethereum 來部署契約並監聽事件,即
var sellFunction = contract.GetFunction("sellAsset"); var gasLimit = await sellFunction.EstimateGasAsync().ConfigureAwait(false); await sellFunction.SendTransactionAndWaitForReceiptAsync(senderAddress, gasLimit, null, null, 563278);
和
var taxRequestEvent = contract.GetEvent("TaxRequest"); var taxFilter = await taxRequestEvent.CreateFilterAsync(); while (true) { var taxEvent = await taxRequestEvent.GetFilterChanges<SalesTaxRequestEvent>(taxFilter); ....
當我在一個契約中擁有所有功能時,即 sellAsset 方法發出外部程式碼正在偵聽的事件並呼叫 sellAsset 函式,這一切都起作用了。但是現在我已將其拆分為兩個單獨的契約,似乎沒有任何事件被觸發。關於為什麼這不起作用的任何想法?
拋開一些使用彙程式序來探索事件日誌的實驗性工作,您無法從合約中讀取事件日誌。發送內部交易(又名消息)的合約可以讀取返回值。因此,請考慮更改
calculateTax()
函式,以便它可以“將數據發送回合約”。function calculateTax(int price) public returns(int) { emit TaxRequest(price); return price; }
然後在
AssetContract
// Public functions function sellAsset(int price) public { int tax = TaxContract(contractAddress).calculateTax(price); }
uint
順便說一句,除非您預期負稅率,否則我認為會起作用。希望能幫助到你。
我遇到了與您類似的情況,我需要擷取由我的呼叫者聯繫人呼叫的契約生成的事件。
我通過使用這樣的
GetAllChanges
東西解決了它:var receipt = await sellFunction.SendTransactionAndWaitForReceiptAsync(senderAddress, gasLimit, null, null, 563278); var taxRequestEvent = contract.GetEvent("TaxRequest"); var taxFilter = await taxRequestEvent.CreateFilterAsync( new BlockParameter(receipt.BlockNumber), new BlockParameter(receipt.BlockNumber)); var taxEvents = await taxRequestEvent.GetAllChanges<SalesTaxRequestEvent>(taxFilter);