波场
在发明者量化交易平台,通过exchange.IO()函数可以实现对波场(TRON)链上gRPC方法和智能合约的调用,从而编写相关策略代码。
注册ABI
默认已注册TRC20的合约ABI,底层封装了自动根据合约地址获取合约ABI的机制。通常情况下无需手动注册ABI,仅在某些合约ABI无法自动获取时才需要手动注册。
注册ABI的方式与以太坊一致,例如:
javascript
// USDT合约地址:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
let abi = `[{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`
// 注册 balanceOf 方法
exchange.IO("abi", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", abi)
调用TRON的RPC方法
使用exchange.IO()函数调用TRON的RPC方法。对于需要签名的方法,底层已自动封装签名操作。以下列举常用方法,其他方法请参考TRON官方项目文档。
- GetAccountjavascriptexchange.IO("api", "tron", "GetAccount", "TKCG...") // "TKCG..."为TRON钱包地址,该函数返回"TKCG..."地址的账户信息。
- GetAccountResourcejavascriptexchange.IO("api", "tron", "GetAccountResource", "TKCG...") // 获取指定钱包地址的资源,包括能量和带宽。
- GetContractABIjavascriptexchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") // 获取 USDT TRC20合约ABI
- GetAssetIssueByNamejavascriptexchange.IO("api", "tron", "GetAssetIssueByName", "TRX") // 根据代币名称获取代币资产信息
- GetNowBlockjavascriptexchange.IO("api", "tron", "GetNowBlock") // 获取当前区块信息
- GetBlockByNumjavascriptexchange.IO("api", "tron", "GetBlockByNum", 70624300)
- GetTransactionByIDjavascriptexchange.IO("api", "tron", "GetTransactionByID", "05a8fae2cd1cbf36b61d12e219588d25b4826436f055f93388a96e620ec3f3f2") // 根据交易哈希值获取Transaction
- TRC20ContractBalancejavascriptexchange.IO("api", "tron", "TRC20ContractBalance", "TKCG...", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") // 获取钱包 USDT 余额,注意返回的数据未经精度处理,例如返回数据为:```6890251```,即```6.890251 USDT```。
- TriggerConstantContractjavascriptfunction main() { let ret = exchange.IO("api", "tron", "TriggerConstantContract", "", "TSUUVjysXV8YqHytSNjfkNXnnB49QDvZpx", "token0()", "") // 调用智能合约的token0()方法,TriggerConstantContract用于调用只读方法 let data = exchange.IO("decode", "address", Encode("raw", "raw", "hex", ret["constant_result"][0])) // 解码数据 return data // data: 0x891cdb91d149f23b1a45d9c5ca78a88d0cb44c18 }
- TRC20Calljavascriptfunction main() { let ret = exchange.IO("api", "tron", "TRC20Call", "", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "0x06fdde03", true, 0) // 使用TRC20Call调用只读方法0x06fdde03 let data = Encode("raw", "raw", "hex", ret.constant_result[0]) return exchange.IO("api", "tron", "ParseTRC20StringProperty", data) // Tether USD }
- Transferjavascriptexchange.IO("api", "tron", "Transfer", "TWTbn...", "TKCG...", 1000000) // 使用Transfer方法转账TRX,从"TWTbn..."转至"TKCG...",1000000即1TRX。
编码/解码
当交易所对象设置为Web3并选择TRON时,编码/解码等操作与以太坊的Web3交易所对象保持一致。
- encode:javascriptlet ret = exchange.IO("encode", "address", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") Log(ret) // ret: 000000000000000000000000a614f803b6fd780986a42c78ec9c7f77e6ded13c , 对USDT代币的TRON地址进行编码。
- decode:javascriptlet data = "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a5465746865722055534400000000000000000000000000000000000000000000" let ret = exchange.IO("decode", "string", data) Log(ret) // ret: Tether USD , 类似于ParseTRC20StringProperty的功能
- encodePacked:javascriptlet ret = exchange.IO("encodePacked", "address", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") Log(ret) // ret: a614f803b6fd780986a42c78ec9c7f77e6ded13c
调用智能合约方法
TRON上智能合约方法的调用与以太坊基本一致,以下是一个具体示例,演示如何:
-
调用智能合约方法,在一次请求中调用多个合约方法:
javascriptfunction main() { let usdtAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" // token usdt contract address let data1 = exchange.IO("encode", usdtAddress, "name") // call function: name let data2 = exchange.IO("encode", usdtAddress, "decimals") // call function: decimals let data3 = exchange.IO("encode", usdtAddress, "balanceOf", "TKCG...") // call function: balanceOf var data = [] data.push([usdtAddress, data1]) data.push([usdtAddress, data2]) data.push([usdtAddress, data3]) exchange.IO("abi", "TGXuuKAb4bnrn137u39EKbYzKNXvdCes98", `[{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct TronMulticall.Call[]","name":"calls","type":"tuple[]"}],"name":"aggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes[]","name":"returnData","type":"bytes[]"}],"stateMutability":"view","type":"function"}]`) let ret = exchange.IO("api", "TGXuuKAb4bnrn137u39EKbYzKNXvdCes98", "aggregate", data) Log("name:", exchange.IO("decode", "string", ret["returnData"][0])) Log("decimals:", exchange.IO("decode", "uint8", ret["returnData"][1])) Log("balanceOf:", exchange.IO("decode", "uint256", ret["returnData"][2])) }输出内容:
log信息 balanceOf: 6890251 信息 decimals: 6 信息 name: Tether USD
其它功能调用
-
获取交易所对象配置的钱包地址
与以太坊使用方式一致。 -
切换区块链RPC节点
与以太坊使用方式一致。 -
计算哈希值
javascriptlet algo = "sign" // algo: 使用的算法、方式 let inputFormat = "string" // inputFormat: 输入的格式 let outputFormat = "hex" // outputFormat: 输出的格式 let data = "txHash" // txHash: 具体哈希值 let signature = exchange.IO("hash", algo, inputFormat, outputFormat, data) // 返回签名数据当algo参数设置为
"sign"时,表示用于计算签名;设置为其他算法参数时(例如:"sha256"),功能等同于Encode()函数。