Solidity

擷取從另一個合約呼叫的合約觸發的事件

  • March 4, 2022

我正在嘗試計算任意項目/價值的稅。為此,我使用了一份契約作為“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);

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