TON Overflow на русском

552 Темы 1.0k Сообщения

Русское зеркало answers.ton.org

  • 0 Голоса
    2 Сообщения
    3 Просмотры

    TON использует вариант блокчейна, называемый архитектурой "мультиблокчейн", который позволяет ему выполнять сегментирование. Сегментирование - это метод, используемый для разделения большой базы данных на более мелкие, более управляемые части, называемые сегментами. Это позволяет повысить производительность и масштабируемость за счет распределения рабочей нагрузки между несколькими компьютерами.

  • 0 Голоса
    2 Сообщения
    49 Просмотры

    Решено

    # This is a general node, it cannot find all transaction data. wget https://ton.org/global-config.json -P ~/ wget https://ton.org/global-config-wallet.json -P ~/ wget https://ton-blockchain.github.io/global.config.json -P ~/ # This is the archive node, you can find all transaction data wget https://ton.org/global-config-archive.json -P ~/ # The following are general test nodes wget https://ton-blockchain.github.io/testnet-global.config.json -P ~/ wget https://ton.org/testnet-global.config.json -P ~/
  • [Решено] Существует ли мост между TON и сетью Everscale?

    0 Голоса
    2 Сообщения
    6 Просмотры

    Решено

    Как упоминал @<1485940136469336064|ДаниилСедов>, в настоящее время не существует общедоступного моста между TON и Everscale Network. Вы можете отслеживать все мосты на TON по следующей ссылке:

    https://ton.app/bridges

    Официальный мост в настоящее время включает в себя соединение между [Ethereum и Binance](https://ton.org/bridge /).

  • [Решено] Как рассчитываются комиссии за транзакции TON?

    0 Голоса
    2 Сообщения
    553 Просмотры

    Решено

    ** Как учитывается плата?**

    Во-первых, каждый пользователь TON должен иметь в виду, что комиссия зависит от многих факторов. Согласно документам, комиссионные за тонну рассчитываются по этой формуле:

    transactionfee = storagefees + infwdfees + computationfees + actionfees + outfwdfees

    storagefees - это сумма, которую вы платите за хранение смарт-контракта в блокчейне. Фактически, вы платите за каждую секунду, пока смарт-контракт хранится в блокчейне. Ваш кошелек TON также является смарт-контрактом, который взимает арендную плату каждый раз, когда вы получаете или отправляете транзакцию.

    infwdfees - это плата за импорт сообщений из-за пределов блокчейна. Перед обработкой любого сообщения оно должно быть доставлено валидаторам конечной цепочки сегментов. Каждый раз, когда вы совершаете транзакцию, она должна быть доставлена тем валидаторам, которые будут ее обрабатывать. Например, каждая транзакция, которую вы совершаете с помощью своего приложения wallet (например, Tonkeeper), сначала должна быть доставлена между узлами проверки.

    computationfees - это сумма, которую вы платите за выполнение кода на виртуальной машине. Виртуальная машина получает входные параметры из отправленного сообщения и выполняет код смарт-контракта. Чем больше инструкций будет выполнено, тем больше будет комиссия. Например, каждый раз, когда вы отправляете какую-либо транзакцию с помощью своего кошелька (который является смарт-контрактом), вы выполняете код контракта вашего кошелька.

    actionfees - это плата за обработку списка действий, полученных после выполнения кода смарт-контракта. С помощью этого процесса исходящие сообщения отправляются другим смарт-контрактам или другим видимым действиям, совершаемым в блокчейне.

    outfwdfees – означает плату за отправку сообщений за пределы блокчейна TON для взаимодействия с автономными сервисами (например, журналами) и внешними блокчейнами. Плата взимается с валидаторов конечных цепочек шардчейнов. Не используется, так как не реализован.

    Все комиссии назначаются и фиксируются в определенном количестве газа, но сама цена на газ не фиксирована ** (в настоящее время 1 единица газа стоит 1000 нанотонн)**. Плата за газ, как и многие другие параметры в TON, настраивается* и может быть изменена специальным голосованием в основной сети. Для изменения любого параметра требуется получить две трети голосов валидатора.

    Означает ли это, что в один прекрасный день газ может подорожать в 1000 раз или даже больше? Технически, да, но на самом деле, нет. Валидаторы получают небольшую плату за обработку транзакций, и более высокие комиссии приведут к уменьшению количества транзакций, что сделает процесс проверки менее выгодным. Вот почему нет смысла увеличивать сборы.

    Комиссии на TON сложно рассчитать заранее, поскольку их размер зависит от времени выполнения транзакции, статуса учетной записи, содержания и размера сообщения, настроек сети блокчейна, а также от многих переменных, которые невозможно рассчитать до тех пор, пока транзакция не будет отправлена. И именно поэтому торговые площадки NFT обычно берут дополнительное количество TON на всякий случай и возвращают его позже.

    Важно иметь в виду, что на TON вы платите как за выполнение смарт-контракта, так и за используемое хранилище (байты*секунда). Это означает, что вы должны платить арендную плату за то, что у вас есть кошелек TON (обычно он очень-очень маленький). Однако, если вы не пользовались своим кошельком TON в течение значительного времени, вам придется заплатить значительно большую комиссию, чем обычно.

    Среднее количество транзакций TON в секунду, по данным tonmon.xyz, в настоящее время составляет 1,4, но комиссии, в отличие от других блокчейнов, останутся прежними, если это значение значительно увеличится. Согласно официальному сайту TON, блокчейн способен выполнять миллионы, а при необходимости и десятки миллионов транзакций в секунду, благодаря поддержке шардинга.

    Сегодня каждая транзакция обходится примерно в 0,005 тонны йен. Даже если цена TON вырастет в 50 раз, транзакции останутся дешевле, чем в других блокчейнах. И не забывайте, что валидаторы могут снизить это значение, если увидят, что комиссии стали дорогими.

    Спасибо нашему подписчику за этот вопрос. Нам было очень интересно изучить этот очень всеобъемлющий аспект TON. Мы приветствуем вопросы и отзывы от всех наших подписчиков через нашего бота. Мы всегда рады погрузиться глубже и прояснить любые моменты, касающиеся TON.

    Расчет сборов

    storage_fees storage_fees = ceil((account.bits * bit_price + account.cells * cell_price) * период / 2 ^ 16)

    in_fwd_fees, out_fwd_fees msg_fwd_fees = (lump_price + ceil((bit_price * msg.bits + cell_price * msg.cells)/2^16))

    ihr_fwd_fees = ceil((msg_fwd_fees * ihr_price_factor)/2^16)

    // биты в корневой ячейке сообщения не включаются в msg.bits (за них платит lump_price)

    action_fees action_fees = сумма(out_ext_msg_fwd_fee) + сумма(int_msg_mine_fee)

    Конфигурационный файл

    Все сборы указаны в определенном количестве газа и могут быть изменены: конфигурационный файл представляет текущую стоимость сбора.

    A direct link to the config file

    storage_fees = p18

    in_fwd_fees = p24, p25

    computation_fees = p20, p21

    action_fees = p24, p25

    out_fwd_fees = p24, p25

    первоначально появилось на [@thedailyton](***Скрыто***

    click to show )

  • 0 Голоса
    3 Сообщения
    399 Просмотры

    Используйте TON API https://tonapi.io/docs

    И API Uniton - https://api.uniton.app/

  • 0 Голоса
    2 Сообщения
    47 Просмотры

    Решено

    Вы можете сохранить хэш транзакции перед ее отправкой, а затем запросить метод API Toncenter getTransactionByInMessageHash, чтобы проверить, была ли подтверждена транзакция с таким хэшем или нет

    Пример:

    // Sleep function: const sleep = ms => new Promise(r => setTimeout(r, ms)) // `msg` is a Cell containing your external message // Convert message Cell to BOC String const boc = await msg.toBoc(false) // Calculate it's hash const hash = tonweb.utils.bytesToBase64(await msg.hash()) // Send message and run a loop until transaction with that hash confirms await tonweb.sendBoc(boc) var txs = [] while (txs.length == 0) { await sleep(1200) // some delay between API calls const resp = await fetch('https://toncenter.com/api/index/getTransactionByInMessageHash?&include_msg_body=false&msg_hash=' + encodeURIComponent(hash)) txs = await resp.json() } console.log('Done!')
  • 0 Голоса
    2 Сообщения
    47 Просмотры

    Решено

    При обсуждении платежей в TON вам следует знать о двух методах:

    1. Платежные каналы

    Этот метод полезен, когда у вас много мелких платежей между несколькими сторонами и стоимость газа (комиссия за транзакцию) является проблемой. Этот метод устранит блокчейн-сборы и сделает их постоянными и независимыми от количества платежей.

    Метод работает с использованием стандартного смарт-контракта под названием PaymentChannel, экземпляр которого обе стороны развертывают. Затем обе стороны вносят в контракт некоторое количество монет TON. Затем они осуществляют транзакции вне сети и могут осуществлять тысячи платежей между собой без уплаты каких-либо комиссий. Только когда канал будет закрыт, контракт рассчитает, как внесенные деньги должны быть разделены между сторонами, и фактически отправит им деньги по цепочке.

    Дополнительная информация: https://github.com/ton-blockchain/payment-channels

    И вот клиентская библиотека в JS, которая облегчает процесс.

    2. Простой платеж

    Этот метод намного проще и его следует использовать, когда вы ожидаете единовременного платежа и газ не является проблемой. В этом случае вы просто создаете новый кошелек для получателя (например, магазин электронной коммерции) и внедряете небольшой серверный модуль, обычно на JavaScript или Python, который периодически запрашивает кошелек, чтобы узнать, были ли на него произведены какие-либо платежи.

    Вы можете развернуть контракт кошелька, используя любой стандартный кошелек TON, такой как TonKeeper, а затем использовать его адрес в своем бэкэнде, чтобы периодически проверять, получены ли платежи.

    Дополнительная информация: https://ton.org/docs/#/payment-processing/deposits-single-wallet

    И если вы поклонник JavaScript, вот хороший пост в блоге, показывающий, как это можно легко сделать: https://society.ton.org/how-ton-wallets-work-and-how-to-доступ-к-ним-из-javascript

    const tonMnemonic = require("tonweb-mnemonic"); const TonWeb = require("tonweb"); async function main() { // mnemonic to key pair const mnemonic = "rail sound peasant ... portion gossip arrow"; // 24 words const mnemonicArray = mnemonic.split(" "); const keyPair = await tonMnemonic.mnemonicToKeyPair(mnemonicArray); console.log("public key:", Buffer.from(keyPair.publicKey).toString('hex')); // list available wallet versions const tonweb = new TonWeb(new TonWeb.HttpProvider("https://toncenter.com/api/v2/jsonRPC")); console.log("wallet versions:", Object.keys(tonweb.wallet.all).toString()); // instance of wallet V4 r2 (from the list printed above) const WalletClass = tonweb.wallet.all["v4R2"]; const wallet = new WalletClass(tonweb.provider, { publicKey: keyPair.publicKey }); const address = await wallet.getAddress(); console.log("address:", address.toString(true, true, true)); const seqno = await wallet.methods.seqno().call(); console.log("seqno:", seqno); await sleep(1500); // avoid throttling by toncenter.com const balance = await tonweb.getBalance(address); console.log("balance:", TonWeb.utils.fromNano(balance)); } main(); function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
  • 0 Голоса
    2 Сообщения
    18 Просмотры

    Решено

    Для одного контракта на TON невозможно вызвать метод в другом смарт-контракте на TON.

    Шаблон контрактов, вызывающих контракты синхронно (в рамках потока одной и той же транзакции), исходит от Solidity и EVM, но этот шаблон применим не ко всем блокчейнам. Существует несколько концептуальных различий между TON и EVM - вы можете прочитать о них подробнее [здесь](https://society.ton.org/six-unique-aspects-of-ton-blockchain-that-will - неожиданность-солидность-разработчики).

    Лучше просматривать смарт-контракты на TON, такие как micro services, которые запущены на разных машинах. Они могут отправлять сообщения друг другу, но эти сообщения являются асинхронными, а не атомарными - поэтому они могут обрабатываться в разных блоках (в разных транзакциях).

    Вам нужно будет учесть это в вашей контрактной архитектуре. Вот несколько идей о том, как это сделать:

    Допустим, вашему контракту необходимо знать свой собственный баланс токенов. Вы можете сохранить этот баланс в переменной в вашем собственном контракте. Каждый раз, когда ваш токеновый кошелек получает токены, вы можете организовать отправку вам уведомления и обновлять эту переменную при получении этого сообщения.

    Чтобы запросить данные из другого контракта, вы можете отправить ему сообщение, и другой контракт ответит сообщением, содержащим ответ. Это разделит поток на 3 разные транзакции, что повлечет за собой свои собственные сложности, такие как отмена любых эффектов первой, если одна из последующих завершится неудачей.

  • 0 Голоса
    2 Сообщения
    27 Просмотры

    Решено

    Вариант 1 - загрузить предварительно скомпилированные двоичные файлы TON

    Вы можете найти предварительно скомпилированные двоичные файлы для func, fift и lite-client в репозитории https://github.com/ton-defi-org/ton-binaries

    Загрузите двоичные файлы из Релизов страница этого репозитория - убедитесь, что выбрали правильную версию в соответствии с используемой вами операционной системой и установили дополнительные зависимости

    После загрузки убедитесь, что загруженные двоичные файлы являются исполняемыми, изменив их разрешения (т.е. запустив chmod +x fift). Также полезно поместить эти двоичные файлы в свой путь (или скопировать их в /usr /local /bin), чтобы убедиться, что вы можете получить к ним доступ из любого места.

    Чтобы проверить, что все было установлено правильно, запустите в терминале fift -V && func -V && lite-client -V

    Если вы планируете использовать fift, также скачайте fiftlib.zip , откройте zip-файл в каком-нибудь каталоге на вашем компьютере (например, /usr/local/lib/fiftlib) и установите переменную окружения FIFTPATH так, чтобы она указывала на этот каталог.

    Вариант 2 - скомпилируйте самостоятельно

    Если вы не хотите полагаться на предварительно скомпилированные двоичные файлы и предпочитаете компилировать их самостоятельно, вы можете следовать официальным инструкциям. Это, конечно, самый безопасный вариант, но он требует больше усилий.

    Суть инструкций для Linux (Ubuntu / Debian) приведена ниже:

    sudo apt update sudo apt install git make cmake g++ libssl-dev zlib1g-dev wget cd ~ && git clone https://github.com/ton-blockchain/ton.git cd ~/ton && git submodule update --init mkdir ~/ton/build && cd ~/ton/build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j 4 Вариант 3 - другие источники для двоичных файлов

    Основная команда обеспечивает автоматические сборки для нескольких операционных систем в виде Действий на GitHub.

    Перейдите по ссылке выше, выберите рабочий процесс слева, соответствующий вашей операционной системе, нажмите на недавнюю сборку green passing и в разделе "Артефакты" загрузите "ton-двоичные файлы".

  • 0 Голоса
    2 Сообщения
    8 Просмотры

    Решено

    TLDR

    Для обычной работы с пользователем всегда используйте workchain 0- это рабочая цепочка с workchain_id = 0

    Какие существуют различные цепочки в TON? One master chain \ - специальная уникальная рабочая цепочка с workchain_id = -1

    В основном используется сетевыми валидаторами для выполнения PoS-контрактов, > обычные пользователи обычно не отправляют транзакции по этой цепочке.

    До 2 ^ 32 workchains - сегодня есть только один с workchain_id = 0, но, возможно, в будущем их будет больше

    99,9% пользовательских транзакций в TON происходят на workchain 0 , это > то место, где вам следует работать, если вы точно не знаете, что делаете.

    До 2^60 shardchains на каждую workchain (все они имеют одинаковый workchain_id)

    Это внутренняя деталь реализации бесконечного сегментирования TON > (автоматическое масштабирование). Если какая-либо из рабочих цепочек находится под большой нагрузкой, она будет автоматически разделена на две цепочки сегментов, а когда нагрузка уменьшится, она будет объединена обратно. Обычно вас это не волнует, это происходит под капотом. Когда вы развертываете контракты или отправляете транзакции, вам не нужно > указывать цепочку сегментов, над которой вы работаете, она рассчитывается системой > автоматически.

  • 0 Голоса
    2 Сообщения
    47 Просмотры

    Решено

    В TVM есть специальная функция для сброса переменных в debug - ~дамп

    Запустите ~dump(имя_переменной);, чтобы напечатать содержимое переменной.

    Запустите ~dump(12345);, чтобы напечатать число 12345.

    Пример:

    () recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure { ;; let's say I want to print the value of the variable msg_value ~dump(msg_value); }

    Пожалуйста, обратите внимание, что эта команда не будет выполняться в основной сети, поэтому не развертывайте производственные контракты с ее помощью. Мой любимый способ локального тестирования смарт-контрактов - это использование [ton-contract-executor](https://github.com/Naltox/ton-contract - executor) - эта потрясающая библиотека запускает локальную версию TVM в веб-сборке прямо внутри Node.js , что очень удобно для написания тестов на JavaScript/TypeScript.

    Чтобы включить отладочную печать в ton-contract-executor, при создании экземпляра контракта передайте debug: true в SmartContractConfig и распечатайте журналы после взаимодействия с контрактом:

    import { SmartContract } from "ton-contract-executor"; const contract = await SmartContract.fromCell(codeCell, dataCell, { debug: true // enable debug }); const send = await contract.sendInternalMessage(...); console.log(send.logs); // print the logs
  • 0 Голоса
    3 Сообщения
    47 Просмотры

    Это проект, который мы обсуждали в прошлом. В прошлом free ton (everscale) создавал аналогичный компилятор solidity. https://github.com/tonlabs/TON-Solidity-Compiler/blob/master/API.md#compiler-версия

    Кажется, он устарел внутренне, я забыл почему.