Transactions
如何辨識智能合約交易
抱歉,如果這是一個菜鳥問題。但是我在理解一個概念時遇到了一些麻煩。
我正在設計一個智能合約,我需要從多個來源為同一交易發送數據。合約只有合約地址作為標識符,那麼如何確保在同一筆交易中結合各種屬性呢?
例如,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_) ; } }