Band 预言机(历史测试网示例)

保留早期 BandChain devnet 桥接合约的集成方式,仅供理解历史架构,不用于新的生产集成。

本页记录的是早期 TRON 与 BandChain devnet 的测试网集成,不代表 Band 当前产品或当前受支持的 TRON 部署。

⚠️

历史测试网示例

相关 devnet 浏览器和生成的辅助合约文件已不可用。不要把本页地址、预言机脚本 ID 或依赖文件用于新的生产集成。评估 Band 时,请先查阅 Band 当前开发者文档,确认网络支持和合约地址。


桥接合约架构

在这套已退役的方案中,应用通过部署在原 TRON 测试网上的**桥接合约(Bridge Contract)**读取数据,地址为 TPxsemS7h9rrJPZAPDjP7rmLoA4ErYny69。不要假定该地址仍可用。

价格数据来自 BandChain 上发起的数据请求。BandChain 验证者节点从 CoinGecko、CryptoCompare、 TRON 网络、Alpha Vantage API 等多个数据源取数,计算中位数(Median)得出价格。每次请求都执行特定的价格聚合预言机脚本,脚本源码可在 BandChain 开发者网络(Devnet)查看。

当时的桥接合约会获取请求结果并写入合约状态,供消费合约读取。


历史价格喂价数据

该桥接合约在示例仍运行时存储以下价格对,当时的计划更新间隔为 5 分钟。这不是当前可用性或更新频率承诺。

1. 加密货币价格对 (数据源: CoinGecko、CryptoCompare、Binance)

  • BTC/USD
  • ETH/USD
  • TRX/USD
  • BAND/USD

2. 大宗商品价格对 (数据源: Alpha Vantage)

  • XAU/USD (黄金)
  • XAG/USD (白银)

3. 外汇汇率对 (数据源: Alpha Vantage)

  • EUR/USD (欧元)
  • CNY/USD (人民币)
  • JPY/USD (日元)
  • GBP/USD (英镑)
  • KRW/USD (韩元)

除最新价格外,调用方还能从桥接合约获取以下辅助安全参数:

  • 数据精度乘数 (Multiplier):用于放大存储价格精度的十进制乘数。
  • 数据更新时间戳:该特定价格请求在 BandChain 上被解析完成并写入本桥接合约的 Unix 时间戳。
📘

说明

这些参数帮助调用方判断喂价是否在有效期内、数据是否仍然有效,从而防范延迟攻击和过期(stale)数据。


桥接合约数据更新维护

Band 基金会曾在该示例运行期间维护桥接合约。本页原有的后续计划均属于历史信息,不代表当前路线图。


获取并使用价格数据 (Solidity 代码范例)

下面的非运行代码仅用于说明早期桥接合约的调用结构,不应用于读取当前价格或部署新的生产合约:

pragma solidity 0.5.9;
pragma experimental ABIEncoderV2;

import "./Obi.sol";
import {IBridge, IBridgeCache} from "./IBridgeWithCache.sol";
import {ParamsDecoder, ResultDecoder} from "./Decoders.sol";

contract SimplePriceDB {
    using ResultDecoder for bytes;
    using ParamsDecoder for bytes;
    
    IBridgeCache public bridge;
    IBridge.RequestPacket public req;
    
    uint256 public current_price;

    constructor(IBridgeCache bridge_) public {
        bridge = bridge_;
        
        req.clientId = "tron_testnet";
        req.oracleScriptId = 76;
        // OBI 编码后的 {"symbol":"BTC"} 参数:hex"00000003425443"
        req.params = hex"00000003425443";
        req.askCount = 4;
        req.minCount = 3;
    }

    // 从 TRON 上的桥接合约获取最新的 BTC/USD 价格并写入本合约状态变量中
    function setPrice() public {
        IBridge.ResponsePacket memory res = bridge.getLatestResponse(req);
        ResultDecoder.Result memory result = res.result.decodeResult();
        current_price = result.px;
    }
}

1. 引入依赖文件说明

历史合约还依赖三个 Band 专用接口与编码文件。其中部分生成文件已不可获取,因此该示例不能直接编译:

  • Obi.sol:包含一组 OBI(Oracle Binary Encoding)函数,用于对与 BandChain 交互时的二进制数据进行序列化与反序列化。详见 BandChain OBI Wiki。
  • Decoders.sol:辅助解码工具类,用于从预言机的响应报文中提取出结构化的价格数据(px)。
  • IBridgeWithCache.sol:Band 预言机部署在 TRON 上的桥接合约接口。

2. 合约初始化参数说明 (Constructor)

构造函数传入桥接合约的部署地址,并初始化结构体 req(RequestPacket)的各项键值。本示例中各配置项含义如下:

  • clientId ("tron_testnet"):由客户端自定义的预言机请求唯一标识符。
  • oracleScriptId (76):该价格聚合脚本在 BandChain 注册时分配的预言机脚本唯一 ID。
  • params (hex"00000003425443"):序列化后的参数,此处表示查询 "BTC"。
  • askCount (4):请求指定的验证者节点数量。
  • minCount (3):为了通过去信任化共识,执行本请求所需的最少验证者响应数量。minCount 必须小于或等于 askCount。

各可用资产的价格对 Params 参数对照表如下:

价格资产对传入参数的十六进制 (Params Hex)
BTC/USDhex"00000003425443"
ETH/USDhex"00000003455448"
TRX/USDhex"00000003545258"
BAND/USDhex"0000000442414e44"
XAU/USDhex"00000003584155"
XAG/USDhex"00000003584147"
EUR/USDhex"00000003455552"
CNY/USDhex"00000003434e59"
JPY/USDhex"000000034a5059"
GBP/USDhex"00000003474250"
KRW/USDhex"000000034b5257"

3. 数据更新函数说明 (setPrice)

这是与预言机交互的核心方法:内部调用桥接合约的 getLatestResponse(req),传入构造函数中初始化好的请求结构体;再用导入的解码库解析响应数据,把最新 BTC/USD 价格赋给状态变量 current_price。