# WINkLink 價格服務
# 概覽
# WINkLink 價格服務介紹
為確保智能合約能反映真實世界的代幣價格,需經常對合約的價格信息進行更新。 其中,DeFi 資產的價格尤其需要和現實世界資產緊密掛鉤, 否則可能導致套利或合約攻擊,給用戶和開發者造成損失。
WINkLink 價格服務專註於數字貨幣價格對,為去中心化應用(DApp)提供準確穩定的外部世界數字貨幣價格信息。 WINkLink 打造了聚合多個預言機節點價格數據的解決方案,從而提供穩定的價格服務,稱作餵價合約(Price Feed Contract)。
# 支持的價格對列表及配置
# 主網
價格對 | 合約地址(代理) |
---|---|
BTC-TRX | TX4rin6u2SaF3TqANqRgzfSCGi95azQNVY |
BTC-USD | TQoijQ1iZKRgJsAAWNPMu6amgtCJ3WMUV7 |
BTT-TRX | TS26cn4GmmipyGTcgvRRwqL6AyEU6vK4rw |
BTT-USD | TBAAW545oJ6iTxqzezGvagrSUzCpz1S8eR |
BTTOLD-TRX | TUjTmKMxGmH78t5DmY7YsfJFoGw6XyX9VZ |
BTTOLD-USD | TEEnwU47Fgx4Ehii7Xs9bLWK3XKo4fs6sV |
ETH-TRX | TXZ9AUk6nC2454NSDGUWvPB72JxSNJrezX |
ETH-USD | TR2yWYWovJaSM7TfZq7L7sT7ZRugdJJQmL |
JST-TRX | TC19QPF2mjP1ZhXxD8JNKJs4ksxMZkCuNP |
JST-USD | TE5rKoDzKmpVAQp1sn7x6V8biivR3d5r47 |
LIVE-USD | TNdLmxVhdj1H1yGjhhSp33cMaAJKjyTAM4 |
LTC-TRX | TVJPFXKMysYsRWEXJ3JkSnAUPucinUFUB6 |
LTC-USD | TGxGL85kN3W5sGdBiobgWabWFcMEtoqRJJ |
NFT-TRX | TKtc1V6QAY1Gpy511QjzXkLUphG8Dre8CY |
STRX-TRX | TW9bNueyJZA9iZnNXGYkJuPJJ7KFN3o5qw |
NFT-USD | TEC8b2oL6sAQFMiea73tTgjtTLwyV1GuZU |
SUN-TRX | TLLyqXr5cbYEMjzeThe1esss1SVBbxxubu |
SUN-USD | TRMgzSPsuWEcVpd5hv19XtLeCk8Z799sZa |
SUNOLD-TRX | TWAob1YsNzh7bfgkjfAD9MAdarcoSWScWw |
SUNOLD-USD | TEEuSdqyv2NFREtNoUXMTDSmJVK3KCuLac |
TRX-USD | TR5HtpPK4gX4RFC4DCBUHfFgsGkGFEzSAb |
TUSD-TRX | TLXMULb1SRpv841Q54C4DhWkmmGfRA2rUH |
TUSD-USD | TBc3yBP8xcyQ1E3hDTUhRxToMrgekLH2kh |
USDC-TRX | TNTm5ezUGHxYc9Mvst58yYTAjxDmqWWGZc |
USDC-USD | TNu3zS55MP4KnBBP6Maw1nHSzRpc3CXAxm |
USDD-TRX | TWW4P2pck8rFcxx3H8NfnH4qhNPu1V35Pb |
USDD-USD | TJ7jEgoYVaeymVfYZ3bS57dYArwVDS1mhW |
USDJ-TRX | TCBKyYMP4YQFHxYznuUaResHDTaEWLuJNW |
USDJ-USD | TB1MyT7pDCNg8w7cSW1QvYKs4WPzErzP5k |
USDT-TRX | TUfV7S4RYtdmBvtHzedfFPVsK9nvndtETp |
USDT-USD | TKePc46n5CiUCR8LL788TFeKA4kjvNnuem |
WIN-TRX | TQvCG1U2jGTVwXLqvFWR27LDtEJZVgRbEg |
WIN-USD | TSCef3LT3jpLwwXCWhZe3hZoMsYk1ZLif2 |
WSTUSDT-TRX | TKcTU5vCPqBBfuULEGXg9kkLx6Tzs2Zo3x |
# Nile 測試網
- WIN 代幣合約地址:
TNDSHKGBmgRx9mDYA9CnxPx55nu672yQw2
- WinkMid 合約地址:
TLDU7C8K3Gd3pXrAj9gtpVVNRHZHuHHZ8P
價格服務合約地址列表:
價格對 | Nile(代理) |
---|---|
BTC-TRX | TFETSL1Yc8dCJM7z6uBkHhAsPbqP5UaCDE |
BTC-USD | TAX8Pm3FgN74za72TFZrn5gPBxJTKgnnpE |
BTT-TRX | TKbeHN2hdrgSShG6iF3mDsJTu9fFzNrHjo |
BTT-USD | TJdzg4wqBt4JkP1ehbYQufg1cLjbomT2j7 |
BTTOLD-TRX | TETkTRbnyB4ptWiK9qXgiyFxQQ9d8ZacT6 |
BTTOLD-USD | TRpRfFzubR7oheDCwHRbwJRfeFa85L6tWE |
ETH-TRX | TSVJwLrhWBF7K6BkEG6hStjMxQJXAzBABQ |
ETH-USD | TQGyY3mWTTzKKBLBg3wQTSbAGqBnGqYSzX |
JST-TRX | TSf6ZwFrDg5Jvyci1PnRHrrZvPpCCKNTjj |
JST-USD | TJ7SizJiCAjMPAri1CFAxzg4xCRLycumMj |
LIVE-USD | TPxNjLNrn3WAwoyGQgqJyw3dLo9E79mUdH |
LTC-TRX | TWProfbHdGBCf7HVNys5KAbVT4vhUwpu22 |
LTC-USD | TRSFTb2seuQxQqUsyeJ8Wg8XhX1e2g3T19 |
NFT-TRX | TWP99RnyMVKFjzuu9XT5J21qBZu8DwhCum |
NFT-USD | TX5KVe4sp24w5HJ4nfk2ZstRhV8RTFm67W |
STRX-TRX | TEbUQ4gohuK5wdtKmpnGd2kvyzhhznJDCx |
SUN-TRX | TTxxeWGpSDV3zPDxnYXzG1ue7RpTYTvDpY |
SUN-USD | TJjENuVH7TD8RJdGtj22ac6Bt1ktpBGURR |
SUNOLD-TRX | TNfn4qt4QJ7LAndM2aWbxrGGH8CRGvzxui |
SUNOLD-USD | TMKzWKMA1gSwjYSL6VpfCUXLuwPKdjEsQ2 |
TRX-USD | TCeXRh9vcb78j2Eb2oJk4YwwnoHQDT64T1 |
TUSD-TRX | TM1bvBzHkRrQqvvHGi1CC1Heb8ESWreiNW |
TUSD-USD | TUuxMFxv6qPn1ymZoYY45SSK1hhEVAvyKz |
USDC-TRX | TWio8JqYx2aey49ua2ohLoyBPbVVWos8RB |
USDC-USD | TF5a2qhfxtWzUQnAocPoxgKXLe1vEE8oER |
USDD-TRX | TFr7TWdb5RWPNCfecr3HNfnCmNNL8qvgmJ |
USDD-USD | TX264fxRmdhNfUgkruk9orzAVvtCehyowq |
USDJ-TRX | TDJtnT7JRNqmNaqY1mK9i1xWN4GnX1UfGd |
USDJ-USD | TKZUQTYAhH1LTG67QmhX4HxTWZdvLfH9d1 |
USDT-TRX | TJL5M1QqL7oF2ceazAFJ2ump9jf87jUqnK |
USDT-USD | TT2ETLY1Mmx2DKYT9S6fMvKGPqbWH3LDEJ |
WIN-TRX | TP7aHYuXUkKPKsojs9BNJDVyAJeQ2KtfCj |
WIN-USD | TYYMqsRNZTwsiFkRtn2NewvXT9GnnsPBH9 |
WSTUSDT-TRX | TZGEUihByCHG79Hbpider6pGZfY9S8ct6P |
# 申請新價格對
如您想在 WINkLink 申請添加新價格對,請填寫並提交此表格。 (opens new window)
# 使用現有的 WINkLink 價格服務
# 獲取最新價格
使用 AggregatorInterface 接口獲取 Consumer 合約的最新價格數據。
這一接口定義了餵價合約提供給用戶的函數。 下方的代碼示例展示了如何使用 AggregatorInterface 接口獲取最新價格:
pragma solidity ^0.5.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
}
contract PriceConsumer {
AggregatorInterface internal priceFeed;
/**
* Price Aggregator Address: TYZxQSHAhxGgUWzxYEZAohvWc9cQWXtNBt
*/
constructor() public {
priceFeed = AggregatorInterface(0xF7e52418572834722ED87E9425d673FEdBD55a0e);
}
/**
* Returns the latest price
*/
function getLatestPrice() public view returns (int) {
// If the round is not complete yet, timestamp is 0
require(priceFeed.latestTimestamp() > 0, "Round not complete");
return priceFeed.latestAnswer();
}
}
# 獲取價格歷史
AggregatorInterface 接口使用 getAnswer(uint256 roundId) 函數獲取價格歷史, 對應的時間戳可通過 getTimestamp(uint256 roundId) 獲得。
# 設置餵價合約
# 部署合約
WINkLink 生態采用去中心化架構,所有智能合約開源,任何組織和個人都可以部署自己的 WINkLink 預言機合約, 並對外公布所提供的服務。
用戶可以從各個公開 WINkLink 服務中選擇自己所需的組合,創建自己的聚合數據合約,享受去中心化機制帶來的便利。
項目合約可點此查看:https://github.com/tron-oracle/winklink-libocr/tree/main/tvm-contracts (opens new window) - 連接您的 Github 賬戶
您可以使用以下任一工具或程序庫進行合約部署和調用測試::
- TronScan: Mainnet (opens new window), Nile Testnet (opens new window)
- Official wallet-cli (opens new window)
- Tron IDE (opens new window)
- TronBox (opens new window)
- tronweb (opens new window)
# 聚合器合約
聚合器合約部署在波場 TRON 公鏈上,具有以下功能:
- 接受來自 WINKLink 節點的鏈下聚合傳輸
- 計算數據請求的 WIN 代幣費用,準許預言機節點領取獎勵;
- 實現 Owned 接口, 進而對聚合器合約暴露的不同方法提供權限控制。
合約代碼可於 AccessControlledOCRAggregator.sol 查看。
# 啟動餵價服務節點
# 節點部署
合約部署完畢後,即可開始 WINLink 節點部署。
WINkLink 節點(項目目錄節點)代碼可點此查看:https://github.com/tron-oracle/winklink-2.0/tree/main (opens new window) — 連接您的 Github 賬戶。
WARNING
當前節點實現包含通過交易所 API 訪問代幣價格的適配器。 請在中國大陸以外的穩定網絡環境中運行節點。
# 準備節點賬戶
每個 WINLink 節點必須與一個波場帳戶關聯,以便調用聚合器合約傳輸數據。
賬戶地址和私鑰生成後,開發人員可以在測試網水龍頭頁面測試 TRX 代幣。該代幣用於支付調用智能合約產生的手續費。
節點初始運行時將生成賬戶,私鑰將存儲在密鑰鏈中。 節點將使用該賬戶進行餵價傳輸。
WARNING
賬戶尚未激活,請轉賬任意數量的 TRX 到該賬戶以進行激活
# 所需環境
WINkLink 節點依賴 PostgreSQL 數據庫, 開發者可在 PostgreSQL 的官方文檔中獲取更多信息。
TIP
這裏假定本機部署的 PostgreSQL 實例的用戶名和密碼分別是 root:root。 在生產環境中請使用強密碼或其他驗證方式。
WINkLink 節點使用的編程語言為 Go,因此需要搭建 Golang 環境。
# 節點配置
WINkLink 節點的配置文件格式為 TOML, 主配置為 tools/config/config.toml。 你可以使用 secrets.toml 指定要使用的 db 實例。 以下為參考模板。
# secrets.toml
[Database]
URL = 'postgresql://root:root@localhost:5432/winklink?sslmode=disable' # Require
AllowSimplePasswords = true
[Password]
Keystore = 'keystorePassword' # Required
[Tron]
TronApiKey = 'apiKey'
節點配置文件確認完畢後,還需要創建 apicredentials 文件和密碼,然後寫入用戶 ID 和密碼訪問節點 API:
# apicredentials
example.user@fake.email
totallyNotFakePassword (16 characters long)
# password
totallyNotFakePassword (16 characters long)
TIP
請妥善托管您的個人信息。
# 搭建節點 Docker 鏡像
使用以下指令構建標準的 Linux 鏡像:
#build a docker image
docker buildx build --platform linux/amd64 -t winklink-2.0 -f core/winklink.Dockerfile .
將構建好的 Docker 鏡像打上標簽並推送到所需的存儲庫進行部署。
# 用源代碼啟動節點
前往 winklink-2.0 源代碼的基本目錄
搭建命令行界面
make install
使用以下指令及對應配置項啟動 WINkLink 節點:
winklink -c /tools/config/config.toml -s /tools/config/secrets.toml node start -p /tools/secrets/vrfpassword -a /tools/secrets/apicredentials
WARNING
節點帳號必須有足夠的 TRX 代幣,用於合約調用。 可以通過測試網水龍頭申請測試代幣。
# 為節點添加任務
節點的任務代表其所支持的數據服務,每個任務都有一個 32 字節的唯一 ID。 對終端用戶而言, (預言機地址,任務 ID) 唯一標識了一個 WINLink 節點提供的數據服務。 每個 WINkLink 節點都可以提供多項數據服務。
WINLink 節點正常運行後,就可以通過 Operator UI 為節點添加任務:
示例:(將下列參數修改為上述步驟中部署的預言機合約地址)
TIP
如涉及引導節點,請在配置文件中設置 DefaultBootstrapPeers。
Example: DefaultBootstrapPeers = ['/ip4/127.0.0.1/tcp/6788/p2p/12D3KooWMrKGdnH6nBrf7hDz25NXFSFNk7vgsTxj9bHskWEct4xh']
# 引导节点
type = "offchainreporting"
schemaVersion = 1
tvmChainID = 1
name = "TUSD-TRX"
contractAddress = "ACCESS-CONTROLLED-OCR-AGGREGATOR-ADDRESS"
p2pBootstrapPeers = [
"/ip4/127.0.0.1/tcp/6788/p2p/P2P-PEER-ID",
]
isBootstrapPeer = true
keyBundleID = "NODE-KEY-BUNDLE"
forwardingAllowed = false
maxTaskDuration = "0s"
TIP
確保引導節點和預言機節點被配置為單獨的實體,每個實體鏈接到其唯一的數據庫實例。 在本地進行操作時,通過修改 config.toml 文件為每個實例指定不同的端口號,以便訪問每個實例各自的 Operator UI。
[WebServer]
HTTPPort = 3000
SecureCookies = false # Default
# 預言機節點
type = "offchainreporting"
schemaVersion = 1
tvmChainID = 2
name = "OCR: TUSD-TRX"
contractAddress = "ACCESS-CONTROLLED-OCR-AGGREGATOR-ADDRESS"
p2pBootstrapPeers = [
"/ip4/127.0.0.1/tcp/6788/p2p/P2P-PEER-ID",
]
isBootstrapPeer = false
keyBundleID = "NODE-KEY-BUNDLE"
transmitterAddress = "THE-CURRENT-NODE-EIP55-ADDRESS"
observationTimeout = "10s"
blockchainTimeout = "20s"
contractConfigTrackerSubscribeInterval = "2m"
contractConfigTrackerPollInterval = "1m"
contractConfigConfirmations = 3
observationSource = """
ds_http [type="http" method=GET url="https://www.okx.com/api/v5/market/index-tickers?instId=TUSD-USD"]
ds_parse [type="jsonparse" path="data,0,idxPx"]
ds_converttrx [type="converttrx" url="https://www.okx.com/api/v5/market/index-tickers?instId=TRX-USD" path="data.0.idxPx"]
ds_multiply [type="multiply" times=1000000]
ds_http -> ds_parse -> ds_converttrx -> ds_multiply
"""
# 查詢任務
開發者可以在 Operator UI 的任務選項卡下檢索任務。
子選項卡如下:
- 概覽:最近的運行任務和任務流列表
- 定義:任務規範
- 錯誤:自任務創建以來累計遇到的不同錯誤
- 運行:所有任務運行的列表