Transactions

如何辨識智能合約交易

  • December 3, 2021

抱歉,如果這是一個菜鳥問題。但是我在理解一個概念時遇到了一些麻煩。

我正在設計一個智能合約,我需要從多個來源為同一交易發送數據。合約只有合約地址作為標識符,那麼如何確保在同一筆交易中結合各種屬性呢?

例如,Oracle A 會將數據 X 發送到 Contract B。要完成交易,Contract B 還需要來自 Oracle C 的數據。如果所有交易的合約地址都相同,我如何通知 Oracle C 將數據發送到哪裡.

我是否先創建一個事務,然後使用該初始事務雜湊作為參考繼續工作?

不幸的是,不可能使用交易雜湊作為標識符 - 它無法在智能合約中獲得。但是您可以自己為每個“初始”事務生成一些唯一標識符,例如 GUID(沒有分隔符,它只適合 bytes32)。

預言機與合約互動的可能原理如下所示。在您的範例中,Oracle A 可以通過SendData方法將數據發送到契約。如果在數據處理過程中發現需要從 Oracle C 獲取額外數據,則引發Request事件,指示目標 Oracle 和 Oracle A 傳輸的事務 ID。

Oracle C 在其地址中擷取事件,通過GetTxData方法請求 Oracle A 傳輸的數據,然後使用從事件接收的初始事務的 ID 通過相同的SenData方法或通過其他方法發送失去的數據。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.4 <0.9.0;

contract Test
{

   mapping (bytes32 => string) tx_data ;
   
   event Request(bytes32  oracle_id, bytes32  tx_id); 

   constructor() 
   {
   }

   function GetTxData(bytes32  tx_id_) public view returns (string memory)
   {
      return(tx_data[tx_id_]) ;
   }

   function SendData(bytes32  tx_id_, string memory data_) public
   {
   
// Logic processing....

           tx_data[tx_id_]=data_ ;

             emit Request("Oracle_C", tx_id_) ;
   }

}

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