avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

作成日:: 2025-02-28 17:20:12, 更新日:: 2025-03-11 18:04:16
comments   0
hits   687

[TOC]

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

序文

ブロックチェーン技術の発展により、定量取引はWeb3時代へと移行しています。 FMZ 定量取引プラットフォームは、主要な定量取引ツールとして、長い間 Web3 の方向性を模索しており、イーサリアム関連の機能を提供することで、ユーザーがスマート コントラクトと対話し、資金を管理し、チェーン上で直接自動取引戦略を実行できるようにしています。

現在、FMZ プラットフォームは Web3 取引機能をさらに拡張し、Tron (TRX) ネットワークをサポートしており、ユーザーは Ethereum と Tron の 2 つの主要なパブリック チェーンで定量取引戦略を展開できます。このアップグレードにより、クロスチェーン取引の柔軟性が向上するだけでなく、トレーダーにオンチェーン資産管理の可能性が広がります。

この記事では、以下の内容について詳しく説明します。

  • FMZ プラットフォームの Web3 方向における Tron エコロジー、アプリケーション、開発、およびその他の技術コンテンツについて議論します。
  • FMZ プラットフォーム上の Tron ネットワークに基づく構成を練習します。
  • 実践で使われるリソースと材料
  • Tron ノードでメソッドを呼び出す練習をします。
  • SunSwap は、Tron エコシステムに基づいた DeFi プラクティスです。

トロンの紹介

TRX-TRON 導入詳細 (Feixiaohao より引用)

TRONは2017年9月にジャスティン・サンによって設立され、2018年5月のメインネット立ち上げ以来、多くの素晴らしい成果を達成してきました。 2018 年 7 月、TRON エコシステムは、月間アクティブ ユーザー数が 1 億人を超える分散型 Web 3.0 サービスの先駆者である BitTorrent との統合を完了しました。近年、TRON ネットワークは素晴らしいパフォーマンスを発揮しています。 TRONSCANのデータによると、2022年10月時点で、TRONパブリックチェーンのユーザー総数は1億1,500万人を超え、トランザクション数は40億を超え、総ロック値(TVL)は132億米ドルを超えています。 TRON ネットワークは 2021 年 12 月に完全に分散化され、現在はコミュニティによって管理される分散型自律組織 (DAO) となっています。 2022年5月、TRONは、業界の暗号通貨中央銀行であるTRON Joint Reserveによって裏付けられた分散型超担保ステーブルコインUSDDの発売を発表し、TRONが正式に分散型ステーブルコイン時代へ参入したことを示しました。 2022年10月、ドミニカはTRONを正式に国家ブロックチェーンインフラに指定したと発表し、TRONはブロックチェーンインフラを開発するために主権国家と協力協定を結んだ大規模なパブリックチェーンとなりました。 TRON は、ドミニカの自然遺産と観光名所の世界的な知名度を高めるために、ドミニカのファントークンである Dominica Coin (DMC) を発行する権限を取得しました。同時に、TRON傘下の7つの主要トークンはドミニカで法定デジタル通貨および法定通貨としての地位を付与されました。

  • 高スループット:TRON では TPS の向上により高スループットが実現され、日常使用における実用性は Bitcoin や Ethereum を上回っています。

  • スケーラビリティ: 優れたスケーラビリティと効率的なスマート コントラクトに基づいて、TRON ではアプリケーションにさらに多くの展開方法を持たせることができ、TRON は多数のユーザーをサポートできます。

  • 高い信頼性: TRON は、より信頼性の高いネットワーク構造、ユーザー資産、本質的な価値を備えており、分散型コンセンサスのレベルが高いため、報酬分配メカニズムが改善されています。

実践で使われるリソースと材料

  • TRON メインネット公式 grpc ノード

grpc.trongrid.io:50051

  • その他のノード:

他のノード プロバイダーの JSON-RPC ノード、REST ノードなどを使用できます (HttpQuery を使用してリクエストできます)。 FMZ 上の交換オブジェクトのカプセル化への唯一の呼び出しは、grpc メソッドです。

  • TRONウォレット

TRONウォレットを準備する必要があります。OKX、imTokenなどを使用することも、自分で生成することもできます。

  • tronscan

https://tronscan.org/

  • トロンプロトコル

https://github.com/tronprotocol

  • SunSwap

https://sun.io/?lang=zh-CN#/v3/swap

https://github.com/sunswapteam

FMZでWEB3交換オブジェクトを構成する

FMZ プラットフォームは、Tron をサポートする前は、Ethereum の Web3 開発のサポートを主導していました。 UniSwap 分散型取引所への接続方法については、以前の記事を参照してください。 Tron は Ethereum と互換性があり、ETH と EOS の一部の機能を統合しているため、スマート コントラクトの実行とオンチェーンの相互作用において独自の利点があります。 FMZ プラットフォームで Tron 交換オブジェクト (ウォレット、ノード情報) を構成する方法は、Ethereum 交換オブジェクト (ウォレット、ノード情報) を構成する方法とほぼ同じです。

交換オブジェクトを追加

Exchange の追加ページで:

https://www.fmz.com/m/platforms/add

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

ウォレットを設定し、ChainType として TRON を選択し、デフォルトの RPC ノード アドレスを使用します。

一般的なJSON-RPCノードメソッドの実践

プラットフォームのデバッグ ツールを使用してテストできます。

デバッグツール: https://www.fmz.com/m/debug

eth_getBalance

名前の通り、この方法はEthereumの方法と全く同じであり、機能も全く同じです。このメソッドは、指定された Tron ウォレットの TRX 残高を読み取るために使用されます。

curl https://docs-demo.tron-mainnet.quiknode.pro/jsonrpc \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"method":"eth_getBalance","params":["0x41f0cc5a2a84cd0f68ed1667070934542d673acbd8", "latest"],"id":1,"jsonrpc":"2.0"}'

要求された残高データは非常に大きな 16 進数値であるため、以前の Ethereum 関連の戦略で使用した変換関数が必要です。

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function toInnerAmount(n, decimals) {
    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

Tron ウォレットからコピーされたウォレット アドレスは base58 でエンコードされたアドレスであるため、使用する前に 16 進数でエンコードされたパラメータに変換する必要があります。

function base58ToHex(base58Str) {
    const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    
    var num = BigInt(0)
    for (var char of base58Str) {
        var digit = BigInt(ALPHABET.indexOf(char));
        if (digit === BigInt(-1)) throw new Error("Invalid Base58 character: " + char)
        num = num * BigInt(58) + digit
    }

    var hex = num.toString(16)
    
    if (hex.length % 2 !== 0) {
        hex = "0" + hex
    }

    return "0x" + hex
}

アドレスを変換した後、これをeth_getBalance方法。

テストコードは以下の通りです.

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function toInnerAmount(n, decimals) {
    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

function base58ToHex(base58Str) {
    const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    
    var num = BigInt(0)
    for (var char of base58Str) {
        var digit = BigInt(ALPHABET.indexOf(char));
        if (digit === BigInt(-1)) throw new Error("Invalid Base58 character: " + char)
        num = num * BigInt(58) + digit
    }

    var hex = num.toString(16)
    
    if (hex.length % 2 !== 0) {
        hex = "0" + hex
    }

    return "0x" + hex
}

function main() {
    var tronAddress = "Tron 钱包地址"
    var hexAddress = base58ToHex(tronAddress).substring(2, 44)

    var jsonrpcBase = "https://go.getblock.io/xxx/jsonrpc"  // 具体的JSON-RPC节点
    var body = {
        "method": "eth_getBalance",
        "params": [hexAddress, "latest"],
        "id":1,
        "jsonrpc":"2.0"
    }

    var options = {
        method: "POST",
        body: JSON.stringify(body),
        headers: {"accept": "application/json", "content-type": "application/json"},
        timeout: 1000
    }

    var ret = JSON.parse(HttpQuery(jsonrpcBase, options))
    var balance = ret.result
    return toAmount(balance, 6)
}

TRXのトークン精度は6したがって、bigNumber を処理するときはパラメータ 6 を入力します。

FMZ プラットフォームのデバッグ ツールでテストします。

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

tronscan で照会したウォレット内の TRX 残高を比較すると、データは一貫しています。

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

gRPCノードメソッドの実践

FMZ プラットフォームの主な練習内容は、grpc ノードのメソッド呼び出しです。スペースが限られているため、ここではよく使用されるメソッド呼び出しのみをリストします。

プロトタイプの呼び出し:exchange.IO("api", "tron", "method name", ...)。 「メソッド名」は、呼び出されるメソッドの名前です。

GetAccount

ウォレットアカウント情報を照会します。

function main() {
    var account = exchange.IO("api", "tron", "GetAccount", "tron 钱包地址")  // tron 钱包地址 :填写实际的钱包地址。
    return account
}

折り返しの通話情報(抜粋):

{
    "address": {},
    "balance": 72767348,   // 即钱包的TRX余额:72.767348
    "asset_optimized": true,
    "create_time": 1693463943000,
    ...

GetTransactionInfoByID

振替を確認します。

function main() {
    return exchange.IO("api", "tron", "GetTransactionInfoByID", "305f0c2487095effcf9e2db61f021f976707611424cba57e1d6464736f7f49e7") 
}

返されるデータ:

{"id":{},"fee":1100000,"blockNumber":70192360,"blockTimeStamp":1741229766000,"contractResult":[{}],"receipt":{"net_fee":100000}}

ListNodes

すべてのノード情報を返します。

function main() {
    return exchange.IO("api", "tron", "ListNodes")
}

TRC20GetDecimals

TRC20トークンの精度情報を照会する

function main() {
    return exchange.IO("api", "tron", "TRC20GetDecimals", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")  // USDT
}

TRC20ContractBalance

特定のウォレット アドレス内の特定の TRC20 トークンの残高を照会します。

function main() {
    return exchange.IO("api", "tron", "TRC20ContractBalance", "TRX 钱包地址", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
}

GetNowBlock

現在のブロックチェーンの最新のブロック情報を返します。

function main() {
    return exchange.IO("api", "tron", "GetNowBlock")
}

返されるデータ:

{
    "transactions": [
        {
            "transaction": {
                "raw_data": {
                    "ref_block_bytes": {},
                    "ref_block_hash": {},
                    "expiration": 1741489083000,
                    "contract": [
                        {
                            "type": 1,
                            "parameter": {
                                "type_url": "type.googleapis.com/protocol.TransferContract",
                                "value": {}
                                ...

GetAccountNet

TRON アカウントの帯域幅情報を照会します。

function main() {
    return exchange.IO("api", "tron", "GetAccountNet", "TWTbnQuiWvEg...")
}

返されるデータ:

{
    "freeNetLimit": 600,
    "TotalNetLimit": 43200000000,
    "TotalNetWeight": 26982826755
}

CreateAccount

Tron アカウントを作成します。

function main() {
    return exchange.IO("api", "tron", "CreateAccount", "TWTbnQ...", "TKCG9...")
}

既存のアカウントを作成しようとすると、エラーが返されます:

Futures_OP 4: Contract validate error : Account has existed

GetBlockByNum

ブロックの高さに基づいてブロック情報を取得します。

function main() {
    return exchange.IO("api", "tron", "GetBlockByNum", 70227286)
}

返されるデータ:

{
    "transactions": [
        {
            "transaction": {
                "raw_data": {
                    "ref_block_bytes": {},
                    "ref_block_hash": {},
                    "expiration": 1741334628000,
                    "contract": [
                    ...

TRC20GetName / TRC20GetSymbol

TRC20GetName は、契約アドレスに基づいて TRC20 トークン名を照会します。 TRC20GetSymbol、契約アドレスに従ってTRC20トークンシンボルを照会する

function main() {
    Log("TRC20GetName:", exchange.IO("api", "tron", "TRC20GetName", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
    Log("TRC20GetSymbol:", exchange.IO("api", "tron", "TRC20GetSymbol", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
}

返されるデータ:

2025-03-09 11:18:43.083		信息 TRC20GetSymbol: USDT
2025-03-09 11:18:43.006		信息 TRC20GetName: Tether USD

ParseTRC20…

function main() {
    // 例如某个转账数据中的Data,转换为可读数值
    Log("ParseTRC20NumericProperty:", exchange.IO("api", "tron", "ParseTRC20NumericProperty", "0x00000000000000000000000000000000000000000000000000000001a13b8600"))  // 7000000000

    // 例如某个转账数据中的Data,转换为可读字符串
    Log("ParseTRC20StringProperty:", exchange.IO("api", "tron", "ParseTRC20StringProperty", "0x0000000000000000000000000000000000000000000000000000000055534454"))    // USDT
}

TRC20Call

TRC20 コントラクトを呼び出すには、TRC20 コントラクトの balanceOf メソッドを使用し、最初にそれをエンコードしてから、TRC20Call を使用して呼び出します。

function main() {
    var data = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQuiWvEg...")
    var tx = exchange.IO("api", "tron", "TRC20Call", "TWTbnQuiWvEg...", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", data, true, 0)
    return tx.constant_result
}
  • 「TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t」: TRC20 USDT 契約アドレス。
  • “TWTbnQuiWvEg…” : パラメータ、balanceOf メソッドによって要求された残高の TRX ウォレット アドレス。
  • “balanceOf” : エンコードする必要があるメソッド名。

定数メソッドではブロードキャストは必要ありません。呼び出し結果は tx.constant_result に記録されます。

Transfer

トランスデータを構築します。

function main() {
    var trans = exchange.IO("api", "tron", "Transfer", "TWTb...", "TKCG9FN...", 1000000)
    return trans
}
  • TWTb...: TRXウォレットAのアドレス。
  • TKCG9FN...: TRXウォレットBのアドレス。
  • 1000000: 1TRXを転送します。

返されるデータ:

{
    "transaction": {
        "raw_data": {
            "ref_block_bytes": {},
            "ref_block_hash": {},
            "expiration": 1741493085000,
            "contract": [
                {
                    "type": 1,
                    "parameter": {
                        "type_url": "type.googleapis.com/protocol.TransferContract",
                        "value": {}
                    }
                }
            ],
            "timestamp": 1741493025759
        }
    },
    "txid": {},
    "result": {
        "result": true
    }
}

GetContractABI

コントラクト アドレスに基づいてコントラクト ABI を取得します。

function main() {
    var usdtABI = exchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
    return usdtABI
}

返されるデータ:

{
    "entrys": [
        {
            "constant": true,
            "name": "name",
            "outputs": [
                {
                    "type": "string"
                }
            ],
            "type": 2,
            "stateMutability": 2
        },
        {
            "constant": true,
            "name": "deprecated",
            "outputs": [
                {
                    "type": "bool"
                }
            ],
            "type": 2,
            "stateMutability": 2
        },
        ...

Transfer

に向かってTKCG9FN1j...1TRXをtronウォレットアドレスに送金します。

function main() {
    var ownerAddress = exchange.IO("address")
    var ret = exchange.IO("api", "tron", "Transfer", ownerAddress, "TKCG9FN1j...", 1000000)     
    return ret
}

TriggerConstantContract

スマートコントラクトのメソッドを呼び出します。

function main() {
    var tx = exchange.IO("api", "tron", "TriggerConstantContract", "TWTbnQu...", "TSUUVjysXV8YqHytSNjfkNXnnB49QDvZpx", "token0()", "")
    var ret2 = Encode("raw", "raw", "hex", tx.constant_result[0])
    Log(ret2) // 000000000000000000000000891cdb91d149f23b1a45d9c5ca78a88d0cb44c18
}

返されるデータは、sunSwap 取引プールの token0 トークン アドレスです。

スマートコントラクトメソッド呼び出し

  • USDT残高を確認する

トロンチェーン上のスマートコントラクトメソッドを呼び出すbalanceOfTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tのためにUSDTトークンのスマート コントラクト アドレス。

  function toAmount(s, decimals) {
      return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
  }

  function main() {
      var balance = exchange.IO("api", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "Tron 钱包地址")
      return toAmount(balance, 6)
  }

ウォレット内のUSDTの残高を確認できます:0.000019

FMZ Quantitative Web3 拡張: Tron サポートの追加、オンチェーン トランザクション機能の拡張

exchange.IOのその他の機能

FMZプラットフォームWeb3 tron交換オブジェクトexchange.IOこの関数は以下の機能を実装します。

  • TRX転送
  function main() {
      var ret = exchange.IO("api", "tron", "send", "目标TRX钱包地址", 1)  // 需要注意,参数1 表示 0.000001 TRX ,需要转换数值为链上数值。
      return ret   // 转账hash: 305f0c2487095effcf9e2db61f021f9767076114...
  }
  • スイッチノードアドレス
  exchange.IO("base", "rpc address")  // rpc address 替换为具体的节点地址
  // 或者
  exchange.IO("rpc", "rpc address")
  • スマートコントラクトABIを登録する
  exchange.IO("abi", "contract ABI")  // contract ABI 替换为具体的合约ABI内容
  • 現在の交換オブジェクトにバインドされているウォレットのアドレスを取得します
  exchange.IO("address")  // 返回tron钱包地址
  • pack / encode / encodePacked

pack / encode: データをエンコード/パックし、メソッドを呼び出します。

  function main() {
      // 打包TRC20合约的balanceOf方法调用
      var data1 = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...")  // TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t 为USDT合约地址
      Log(data1)
      var data2 = exchange.IO("encode", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...")
      Log(data2)
      Log("data1 == data2:", data1 == data2)  // true

      // 编码数据为uint256
      var data3 = exchange.IO("pack", "uint256", 19)   // 数据为: 19
      Log(data3)
      var data4 = exchange.IO("encode", "uint256", 19)
      Log(data4)
      Log("data3 == data4:", data3 == data4)
  }

encodePacked: エンコードされパッケージ化された

  function main() {
      var data1 = exchange.IO("encodePacked", "address", "TWTbnQu...")
      Log(data1)
      //                          e0c12e16a9f713e5f104c...

      var data2 = exchange.IO("encode", "address", "TWTbnQu...")
      Log(data2)
      // 000000000000000000000000 e0c12e16a9f713e5f104c...
  }
  • unpack / decode

unpack / decode: データをアンパック/デコードし、メソッドを呼び出します。

  function main() {
      var data = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...")
      Log(data)
      var tx = exchange.IO("api", "tron", "TRC20Call", "TWTbnQu...", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", data, true, 0)
      var ret = Encode("raw", "raw", "hex", tx.constant_result[0])
      Log(ret)

      // 解码
      var usdtBalance = exchange.IO("decode", "uint256", ret)
      Log("usdtBalance:", usdtBalance)

      // 解码
      return exchange.IO("unpack", "uint256", ret)
  }
  • 秘密鍵の更新/インポート
  exchange.IO("key", "xxx")  // xxx 为私钥
  • ハッシュの計算 プロトタイプの呼び出し:exchange.IO("hash", algo, inputFormat, outputFormat, data)

現在設定されている秘密鍵で署名し、署名されたデータを返します。

  var signature = exchange.IO("hash", "sign", "string", "hex", "txHash")  // txHash: 具体hash值

SunSwap の初見

Tron チェーン上の DEX 取引所の初期実践: sunSwap。 sunSwap ファクトリー コントラクトを呼び出して、すべての取引ペアのインデックスを要求し、次にインデックス 1 の取引ペアのアドレスを要求します。

function main() {
    var poolIndexs = exchange.IO("api", "TThJt8zaJzJMhCEScH7zWKnp5buVZqys9x", "allPoolsLength")
    Log("poolIndexs:", poolIndexs)  // 交易对索引总数

    var hexAddress = exchange.IO("api", "TThJt8zaJzJMhCEScH7zWKnp5buVZqys9x", "allPools", exchange.IO("encode", "uint256", 1)) 
    Log("hexAddress:", hexAddress)  // 索引为1的交易对地址
}

スペースが限られているため、sunSwapの詳細な内容については次の記事で読者の皆様にお伝えします。どうぞよろしくお願いいたします。

THE END

FMZ 定量取引プラットフォームは、Web3 時代においても革新を続け、定量取引業者により広範なオンチェーン取引スペースを提供します。 FMZ は、Tron ネットワークをサポートすることで、クロスチェーン トランザクション機能を強化するだけでなく、ユーザーが Tron エコシステム内でスマート コントラクトのやり取り、資金管理、自動取引戦略を効率的に実行できるようにします。

この記事では、FMZ プラットフォームの Tron ネットワークのサポートを紹介し、Tron チェーン上で SunSwap DEX のコントラクト メソッド呼び出しを実装しました。ブロックチェーン技術の発展により、Web3定量取引の可能性は拡大し続けるでしょう。 FMZ は、Web3 機能の最適化と改善を継続し、定量取引業者により柔軟で安全かつ効率的な取引環境を提供し、ユーザーがオンチェーン市場でより大きな優位性を得られるよう支援します。

読んでいただき、また応援していただきありがとうございました。