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

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

    Есть несколько статей, написанных @KAL https://blog.ton.org/step-by-step-guide-for-writing-your-first-smart-контракт-в-функции-2

    Это обзорное руководство, в котором вы пройдете от нуля до конца написания смарт-контракта в FunC, а также с помощью testinYes. Тестовые примеры важны при написании кода, поскольку они помогают проверять правильность кода, выявлять и исправлять ошибки, служат документацией, облегчают обслуживание и повышают уверенность в качестве кода и надежности.

    Есть несколько статей, написанных @KAL https://blog.ton.org/step-by-step-guide-for-writing-your-first-smart-контракт-в-функции-2

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

    Тем не менее, вот свежий учебник от Kal, который также был недавно опубликован: https://ton-community.github.io/tutorials/

    Даже то, что, насколько мне известно, сообщество работает над "Hardhart", "Foundry", аналогичной тестированию, отладке, развертыванию универсальной библиотеки, называемой "Bluepint". Наслаждаться.

    https://github.com/ton-community/blueprint

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

    В отличие от Ethereum, где https://etherscan.io является единственным доминирующим исследователем, TON - это более децентрализованная экосистема с разными исследователями, которые преуспевают в разных вещах. Полный список находится на сайте https://ton.app/explorers

    Несколько интересных из них:

    https://tonscan.org - Отлично подходит для простых вещей, отшлифованный пользовательский интерфейс. Отлично подходит для пользователей, в меньшей степени для разработчиков.

    https://tonwhales.com/explorer \ - Полезен для разработчиков, поскольку показывает гораздо больше низкоуровневой информации, если вам нужно отладить транзакции, которые завершились неудачей.

    https://dton.io \ - Также хорош для разработчиков, так как показывает данные низкого уровня. Имеет очень классную функцию отслеживания транзакций, которая показывает код операции TVM, выполняемый в каждой транзакции.

    Также отмечается, что у исследователей есть специальные версии для testnet. Как https://testnet.tonscan.org

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

    для извлечения данных вы можете использовать эти методы API /RPC.

    Но, с другой стороны, я хотел бы порекомендовать использовать: https://testnet.dton.io/ https://dton.io/

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

    Не могли бы вы, пожалуйста, поподробнее?

    TONCLI - это (очевидно) клиент CLI, что бы вы ожидали от него в VSCode?

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

    Решено

    В 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 Сообщения
    20 Просмотры

    Решено

    https://github.com/awesome-doge/ton-compile/blob/main/ninja-Apple M1.md

    # Install dependent packages brew update brew install openssl cmake llvm brew link openssl --force # Install ninja brew install ninja # generate env folder / clone ton source code mkdir ~/ton-env cd ~/ton-env git clone --recursive https://github.com/ton-blockchain/ton.git # compile cd ~/ton-env/ mkdir ton-bin cd ~/ton-env/ton-bin cmake ~/ton-env/ton \ -DCMAKE_BUILD_TYPE=Release \ -GNinja cpunumber=$(sysctl -n hw.logicalcpu) ninja -j $cpunumber
  • 0 Голоса
    2 Сообщения
    617 Просмотры

    Решено

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

    Установите с помощью:

    pip install ton

    Вот пример того, как он используется для отправки транзакции.

    from .init import client from .wallet import wallet # Viewing transactions txs = await wallet.get_transactions() in_msg = txs[0].in_msg in_msg.source.account_address # Sender in_msg.destination.account_address # Recipient int(in_msg.amount) # Amount in nanoTONs client.from_nano(int(in_msg.value)) # Amount in TONs # Sending transaction with 1 TON await wallet.transfer('EQCl1Ug9ZT9ZfGyFH9l4q-bqaUy6kyOzVPmrk7bivmVKJRRZ', client.to_nano(1), comment='test') # Send transaction with multiple outputs await wallet.transfer( ('EQCl1Ug9ZT9ZfGyFH9l4q-bqaUy6kyOzVPmrk7bivmVKJRRZ', client.to_nano(1), 'test comment'), ('EQCl1Ug9ZT9ZfGyFH9l4q-bqaUy6kyOzVPmrk7bivmVKJRRZ', client.to_nano(0.5), 'test comment 2'), ('EQCl1Ug9ZT9ZfGyFH9l4q-bqaUy6kyOzVPmrk7bivmVKJRRZ', client.to_nano(1)) ) # Sending transaction with raw BOC data from tvm_valuetypes import Cell await wallet.transfer('EQCl1Ug9ZT9ZfGyFH9l4q-bqaUy6kyOzVPmrk7bivmVKJRRZ', client.to_nano(1), data=Cell().serialize_boc())
  • 0 Голоса
    3 Сообщения
    156 Просмотры

    Вы можете использовать TonWeb javascript SDK.

    const tonweb = new TonWeb(); const wallet = tonweb.wallet.create({publicKey}); const address = await wallet.getAddress(); const nonBounceableAddress = address.toString(true, true, false); const seqno = await wallet.methods.seqno().call(); await wallet.deploy(secretKey).send(); // deploy wallet to blockchain const fee = await wallet.methods.transfer({ secretKey, toAddress: 'EQDjVXa_oltdBP64Nc__p397xLCvGm2IcZ1ba7anSW0NAkeP', amount: TonWeb.utils.toNano(0.01), // 0.01 TON seqno: seqno, payload: 'Hello', sendMode: 3, }).estimateFee(); const Cell = TonWeb.boc.Cell; const cell = new Cell(); cell.bits.writeUint(0, 32); cell.bits.writeAddress(address); cell.bits.writeGrams(1); console.log(cell.print()); // print cell data like Fift const bocBytes = cell.toBoc(); const history = await tonweb.getTransactions(address); const balance = await tonweb.getBalance(address); tonweb.sendBoc(bocBytes);
  • 0 Голоса
    2 Сообщения
    31 Просмотры

    Решено

    Чтобы разрабатывать смарт-контракты, вам нужно, по крайней мере, изучить FunC. В процессе вы также можете изучить Fift, чтобы лучше понять, как все работает на более низком уровне.

    Для разработки Telegram-ботов вы можете использовать множество различных языков программирования общего назначения. Здесь доступно множество вариантов.

    Для клиентской части dApps вы можете использовать JavaScript или другие инструменты, которые могут сгенерировать клиентское приложение.