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

    Стандартные токеновые контракты можно найти в основном профиле блокчейна TON на GitHub. Как правило, вы можете искать смарт-контракты FunC в профилях TON blockchain и TON foundation.

    Есть также некоторые фрагменты, которые предоставляют пользователи, такие как фрагменты функций предоставлено TonoxDeFi на GitHub.

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

    Решено

    Короткий ответ - нет. EVM и TVM принципиально отличаются друг от друга, поэтому невозможно напрямую перенести ваш код Solidity в TVM. Однако, возможно, что в будущем будут разработаны инструменты, позволяющие компилировать байт-код ABI в TL-B на основе TVM.

    Для получения дополнительной информации об основных концепциях и сравнения двух блокчейнов вы можете найти дополнительные подробности здесь: https://blog.ton.org/six-уникальныеаспектыблокчейнаton,которыеудивятразработчиковsolidity.

    Для более глубокого понимания различий между Ethereum, Solana и TON сообщество TON создало всеобъемлющий 10-страничный документ, который можно найти здесь: https://ton.org/comparison_of_blockchains.pdf.

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

    Нет, это не тот же код выхода. Вы получаете код выхода "-13". API вызвал lite-server и получил некоторый результат, поэтому вы получили 200 OK. -13 код выхода, я бы сказал, это означает, что method_id не найден в smartcontract (но я не могу найти это замечание в документации).

    13 - Ошибка с нехваткой газа. (это не отрицательное число и означает, что кончился газ)

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

    Привет, так что, если вам нравится, я настоятельно рекомендую вам использовать репозиторий NFT здесь, который использует язык Tact для NFT!

    Это более легко усваивается Существует так же просто, как просто извлечь репозиторий и запустить yarn, чтобы установить библиотеку и развернуть контракт.

    https://github.com/howardpen9/nft-standard-template, наслаждайтесь!

  • Есть ли у TON аналог ремикса?

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    15 Просмотры

    К сожалению, в настоящее время нет чего-то подобного Remix IDE для TON. Лучшей альтернативой, вероятно, была бы загрузка универсальной онлайн-среды разработки для работы со смарт-контрактами на основе [Glitch](https://glitch.com /).

    Как всегда, я бы рекомендовал просто разрабатывать смарт-контракты на локальном компьютере.

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

    Что, если я разработаю смарт-контракт на TON, но не хочу, чтобы данные, включенные в initState, были видны другим пользователям? Означает ли это, что мне нужно использовать шифрование?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

    Оригинал вопроса

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

    Решено

    Да, данные должны помещаться в регистр "c4". c4 ограничен глубиной <=512.Подробнеечитайтездесь:https://ton.org/docs/learn/tvm-instructions/tvm-overview

    Если вы используете ячейки в линейном одинарном дереве ссылок, вы ограничены битами "512 * 1023 = 523776" или около 64 КБ. Но если вы используете все ячейки для хранения данных, то получится очень огромное дерево с большим пространством. Только на нижнем слое у него есть ячейки "4 ** 511".

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

    Решено

    Насколько мне известно, не существует полных удобных интерфейсов для создания DAO на TON. При этом существуют примеры смарт-контрактов и репозиториев, с которыми вы потенциально можете поработать.

    Вероятно, самое близкое к тому, что вы хотите: https://github.com/orbs-network/dao-vote

    Реализация кошелька с несколькими подписями Fift: https://github.com/mir-one/dao-multisig

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

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

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

    Решено

    Если коротко, то да. ** Смарт-контракты записываются в FunC, затем компилируются в Fift и развертываются на блокчейне.** Позже с ними можно взаимодействовать с помощью либо Fift, либо SDK-оболочки.

    С другой стороны, при вызове recv_internal в стеке всегда есть 4 аргумента.

    Объявляя recv_internal с менее чем 4 аргументами, вы заставляете FunC игнорировать большинство глубоких переменных (они все равно будут там, но ваш код не будет знать об этом на протяжении всего выполнения TVM).

    вот пример для recv_internal в последнем [учебном пособии](https://ton - community.github.io/tutorials/02-contract /) построен сообществом:

    () recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure { ;; well known function signature if (in_msg_body.slice_empty?()) { ;; check if incoming message is empty (with no body) return (); ;; return successfully and accept an empty message } int op = in_msg_body~load_uint(32); ;; parse the operation type encoded in the beginning of msg body var (counter) = load_data(); ;; call our read utility function to load values from storage if (op == 1) { ;; handle op #1 = increment save_data(counter + 1); ;; call our write utility function to persist values to storage } }

    Вы можете узнать больше здесь: https://ton.org/docs/learn/tvm-instructions/tvm-обзор#инициализацияtvm

    Для более глубокого понимания вы можете проверить Ch4.4 в техническом документе https://ton.org/tblkch.pdf

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

    Я предполагаю, что вы интересуетесь языком программирования для смарт-контрактов. В настоящее время вы можете выбрать любую функцию (https://ton.org/docs/develop/func) или тактичность (https://docs.tact-lang.org/), оба из которых являются удобочитаемыми языками, используемыми для построения смарт-контрактов.

    Оба этих языка предлагают подключаемый модуль для отображения вашего текущего адреса, аналогичный "address(this)" в Solidity.

    В FunC вы можете использовать:

    slice my_address() asm "MYADDR";

    В такт, вы можете использовать:

    myAddress(): Address;
  • 0 Голоса
    2 Сообщения
    96 Просмотры

    Да, можно изменить код контракта в TON. Просто реализуйте это внутри своего смарт-контракта, который будет обновлять код контракта с помощью функции стандартной библиотеки FunC (stdlib.fc):

    () set_code(cell new_code) impure asm "SETCODE";

    Простая реализация внутри recv_internal:

    #include "stdlib.fc"; global slice ctx_owner; () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { slice cs = in_msg_full.begin_parse(); int flags = cs~load_uint(4); if (flags & 1) { ;; ignore all bounced messages return (); } ;; Admin methods ;; if the in_msg_body is empty, then it is a simple money transfer if (equal_slice_bits(sender_addr, ctx_owner) & (~ in_msg_body.slice_empty?())) { int op = in_msg_body~load_uint(32); if (op == "op::update_code"c) { set_code(in_msg_body~load_ref()); } } }

    Кроме того, вы можете найти спецификацию set_code здесь: https://ton.org/docs/develop/func/stdlib/#set_code

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

    Адрес контракта - это хэш кода **stateInit**.

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

    Например, приведенный ниже язык Tact показывает, как я могу создать код stateInit для получения адреса смарт-контракта:

    contract Example { any_int: Int; init() { self.any_int = 0; } receive("A") { let contractInit: StateInit = initOf TargetContract(self.any_int, 666); send(SendParameters{ to: contractAddress(contractInit), value: 0, mode: 0 + 64 + 128, bounce: false }); } } contract TargetContract { counter: Int; balance: Int; init(input_counter: Int, input_balance: Int){ self.counter = input_counter; self.balance = input_balance; } receive(){ // empty, means do nothing when receive empty body message. } }

    Как вы можете видеть, мы можем изменить параметры, необходимые второму контракту, чтобы предопределить адрес контракта, поскольку мы получили код stateInit.

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

    Решено

    Вы можете использовать ICO-версию смарт-контракта Jetton, которая доступна здесь: https://github.com/ton-blockchain/token-contract/blob/main/ft/jetton-minter-ICO.fc

    Вы должны изменить множитель для вашего джеттона. Например, умножение на 1000 означает, что 1 ТОННА равна 1000 вашим джеттонам.

    Затем вы можете развернуть его, и любой, кто отправит на него Toncoin, получит ваши джеттоны.

    Обратите внимание, что это шаблон, и вы должны добавить к нему дополнительную функциональность, например, остановить его, когда он достигнет определенного количества джеттонов, или удалить адрес администратора.

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

    Нужна дополнительная информация для устранения проблемы.

    На данный момент вы можете выбрать FunC и Tact в качестве языков программирования в TVM (TON Network Virtual Machine).

    Что касается функций, вот обзорное руководство, с которым вам следует ознакомиться: https://ton-community.github.io/tutorials/01-wallet/

    https://ton.org/docs/develop/func/overview

    С другой стороны, синтаксис Tact проще в освоении по сравнению с FunC (*FunC больше похож на C-подобный язык).

    http://tact-lang.org/https://github.com/tact-lang/tact

    Хотя вы можете кодировать в Fift, это не тот случай, о котором мы говорим сегодня.

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

    Решено

    В TON нет единого формата хранения данных. Каждый смарт-контракт может иметь свой собственный способ хранения / кодирования своих данных. Возьмем [смарт-контракт NFT item](https://github.com/ton-blockchain/token-contract/blob/main/nft/nft - item.fc#L19-L47) в качестве примера. Он хранит свои данные в следующем формате:

    ;; ;; Storage ;; ;; uint64 index ;; MsgAddressInt collection_address ;; MsgAddressInt owner_address ;; cell content ;;

    И у контракта есть две внутренние функции для фактической загрузки и сохранения своих данных:

    (int, int, slice, slice, cell) load_data() { slice ds = get_data().begin_parse(); var (index, collection_address) = (ds~load_uint(64), ds~load_msg_addr()); if (ds.slice_bits() > 0) { return (-1, index, collection_address, ds~load_msg_addr(), ds~load_ref()); } else { return (0, index, collection_address, null(), null()); ;; nft not initialized yet } } () store_data(int index, slice collection_address, slice owner_address, cell content) impure { set_data( begin_cell() .store_uint(index, 64) .store_slice(collection_address) .store_slice(owner_address) .store_ref(content) .end_cell() ); }

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

    Однако вам не следует пытаться декодировать данные смарт-контракта напрямую, даже если вы знаете формат сохраненных данных. Правильным способом было бы использовать "общедоступный API" контракта посредством вызова его методов get. В контракте NFT item есть [метод получения](https://github.com/ton-blockchain/token - contract/blob/main/nft/nft-item.fc#L137-L144) именно для этой цели:

    ;; ;; GET Methods ;; (int, int, slice, slice, cell) get_nft_data() method_id { (int init?, int index, slice collection_address, slice owner_address, cell content) = load_data(); return (init?, index, collection_address, owner_address, content); }

    Он вернет вам все необходимые данные в декодированном виде.

    И [здесь](https://github.com/slavafomin/tonweb/blob/typescripted/src/contract/token/nft/nft - item.ts#L83-L109) - это то, как вы бы проанализировали результат этого метода get:

    // Calling the get-method const result = await this.provider.call2( myAddress.toString(), 'get_nft_data' ); // Parsing the data returned by it const isInitialized = ( (expectBN(result[0]).toNumber() === -1) ); const index = expectBN(result[1]).toNumber(); const collectionAddress = ( parseAddressFromCell(result[2]) ); const ownerAddress = (isInitialized ? parseAddressFromCell(result[3]) : null ); const contentCell = result[4]; // Single NFT without a collection const contentUri = ((isInitialized && !collectionAddress) ? parseOffchainUriCell(contentCell) : null );

    Кроме того, некоторые массивы данных хранятся в виде двоичных строк и требуют некоторого нетривиального синтаксического анализа с использованием TL-B schemas. Каждая библиотека предоставит вам несколько утилит для использования. Один из таких инструментов обычно называется "CellSlice", который позволяет вам считывать и декодировать биты битовой строки вручную.

    Рассмотрим этот пример из TonWeb:

    // Encoding some data as a cell const cell = new Cell(); cell.bits.writeUint('100500', 32); cell.bits.writeString('Hello World'); // Reading the data from cell (bit-string) const slice = new CellSlice(cell); slice.loadUint(32); // 100500 slice.loadString(); // Hello World slice.isEmpty(); // true

    Это должно помочь вам начать. Просто обязательно изучите все связанные концепции.

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

    Решено

    Нет, прямо сейчас вы можете использовать только FunC в качестве языка высокого уровня для разработки смарт-контракта.

    Чтобы использовать Rust (или любой другой язык, использующий LLVM), вам следует начать с написания для него серверной части, тогда вы сможете создавать действительные инструкции TON VM из кода rust.