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 и предоставляет функции, связанные с Ethereum, позволяя пользователям взаимодействовать со смарт-контрактами, управлять средствами и реализовывать автоматизированные торговые стратегии непосредственно в цепочке.

Сегодня платформа FMZ еще больше расширила свои возможности торговли Web3 и поддерживает сеть Tron (TRX), позволяя пользователям развертывать количественные торговые стратегии в двух основных публичных цепях Ethereum и Tron. Это обновление не только повышает гибкость кросс-чейн транзакций, но и предоставляет трейдерам больше возможностей для управления активами в сети.

В этой статье мы подробно рассмотрим:

  • Обсудите экологию Tron, приложения, разработку и другие технические аспекты в направлении Web3 платформы FMZ.
  • Практикуйте конфигурацию на основе сети Tron на платформе FMZ.
  • Ресурсы и материалы, используемые на практике
  • Практикуйтесь в вызове методов на узлах Tron.
  • SunSwap — DeFi-практика, основанная на экосистеме Tron.

Введение в Трон

Подробности введения TRX-TRON (цитата из Feixiaohao)

TRON был основан Джастином Саном в сентябре 2017 года и добился многих выдающихся достижений с момента запуска своей основной сети в мае 2018 года. В июле 2018 года экосистема TRON завершила интеграцию с BitTorrent — пионером в предоставлении децентрализованных сервисов Web 3.0 с более чем 100 миллионами активных пользователей в месяц. В последние годы сеть TRON показала блестящие результаты. Данные TRONSCAN показывают, что по состоянию на октябрь 2022 года общее число пользователей публичной сети TRON превысило 115 миллионов, количество транзакций превысило 4 миллиарда, а общая заблокированная стоимость (TVL) превысила 13,2 миллиарда долларов США. Сеть TRON стала полностью децентрализованной в декабре 2021 года и теперь представляет собой децентрализованную автономную организацию (DAO), управляемую сообществом. В мае 2022 года TRON объявил о запуске децентрализованного суперобеспеченного стейблкоина USDD, который поддерживается центральным банком криптовалютной отрасли, TRON Joint Reserve, что ознаменовало официальное вступление TRON в эру децентрализованных стейблкоинов. В октябре 2022 года Доминика объявила TRON своей официальной национальной блокчейн-инфраструктурой, что сделало TRON крупной публичной сетью, которая заключила соглашение о сотрудничестве с суверенным государством с целью развития блокчейн-инфраструктуры. TRON получил разрешение на выпуск фан-токена Доминики — Dominica Coin (DMC) — для повышения глобальной известности природного наследия и туристических достопримечательностей Доминики. В то же время семь основных токенов TRON получили статус законной цифровой валюты и законного платежного средства в Доминике.

  • Высокая пропускная способность: Высокая пропускная способность достигается за счет улучшения TPS в TRON, а его практичность для ежедневного использования превзошла Bitcoin и Ethereum.

  • Масштабируемость: благодаря хорошей масштабируемости и эффективным смарт-контрактам приложения в TRON могут иметь больше методов развертывания, а TRON может поддерживать большое количество пользователей.

  • Высокая надежность: TRON имеет более надежную сетевую структуру, пользовательские активы, внутреннюю ценность и более высокую степень децентрализованного консенсуса, что обеспечивает улучшенный механизм распределения вознаграждений.

Ресурсы и материалы, используемые на практике

  • Официальный узел grpc основной сети TRON

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

Настройка объектов обмена WEB3 на FMZ

До того, как платформа FMZ начала поддерживать Tron, она играла ведущую роль в поддержке разработки Ethereum Web3. Вы можете просмотреть предыдущие статьи, чтобы узнать, как подключиться к децентрализованной бирже UniSwap. Поскольку Tron совместим с Ethereum и интегрирует некоторые функции ETH и EOS, он обладает уникальными преимуществами в исполнении смарт-контрактов и взаимодействии внутри сети. Настройка объектов обмена Tron (кошельков, информации об узлах) на платформе FMZ практически аналогична настройке объектов обмена Ethereum (кошельков, информации об узлах).

Добавить объект обмена

На странице «Добавить биржу»:

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

Расширение FMZ Quantitative Web3: добавлена ​​поддержка Tron, расширены возможности транзакций в цепочке

Настройте кошелек, выберите TRON в качестве ChainType и используйте адрес узла RPC по умолчанию.

Распространенные практики метода узла JSON-RPC

Для тестирования мы можем использовать отладочные инструменты платформы.

Инструменты отладки: https://www.fmz.com/m/debug

eth_getBalance

Как следует из названия, этот метод точно такой же, как метод Ethereum, и его функции точно такие же. Этот метод используется для считывания баланса TRX в указанном кошельке Tron.

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"}'

Запрошенные данные о балансе представляют собой очень большое шестнадцатеричное значение, для которого требуется функция преобразования, которую мы использовали в предыдущей стратегии, связанной с 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, перед использованием его необходимо преобразовать в параметр в шестнадцатеричной кодировке.

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., поэтому заполните параметр 6 при обработке bigNumber.

Тест в отладочном инструменте платформы FMZ:

Расширение FMZ Quantitative Web3: добавлена ​​поддержка Tron, расширены возможности транзакций в цепочке

Сравнивая баланс TRX в кошельке, запрошенном на Tronscan, можно сказать, что данные совпадают.

Расширение 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 мы используем метод balanceOf контракта TRC20, сначала кодируем его, а затем вызываем с помощью 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…»: параметр, адрес кошелька TRX баланса, запрошенного методом balanceOf.
  • “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
}

Возвращенные данные представляют собой адрес токена token0 торгового пула sunSwap.

Вызов метода смарт-контракта

  • Проверить баланс USDT

Вызов метода смарт-контракта в цепочке TronbalanceOfTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tдля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

Платформа ФМЗ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

упаковка/кодирование: кодирование/упаковка данных, вызов метода.

  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

распаковка/декодирование: распаковка/декодирование данных, вызов метода.

  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

Начальная практика на бирже DEX в цепочке Tron: 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, предоставляя количественным трейдерам более широкое торговое пространство в сети. Поддерживая сеть Tron, FMZ не только расширяет возможности кросс-чейн транзакций, но и позволяет пользователям эффективно выполнять смарт-контрактные взаимодействия, управлять фондами и автоматизированные торговые стратегии в экосистеме Tron.

В этой статье мы представили поддержку платформы FMZ для сети Tron и реализовали вызовы методов контрактов SunSwap DEX в цепочке Tron. С развитием технологии блокчейн возможности количественных транзакций Web3 будут продолжать расширяться. FMZ продолжит оптимизировать и совершенствовать свои возможности Web3, чтобы предоставить количественным трейдерам более гибкую, безопасную и эффективную торговую среду, помогая пользователям получать большие преимущества на рынке блокчейна.

Спасибо за прочтение и спасибо за вашу поддержку.