pyTON - API на языке Python для лайт клиента libtonlibjson

admin

Administrator
Команда форума
Сообщения
353
Лучшие ответы
0
Реакции
64
Python API для libtonlibjson (лёгкий клиент Telegram Open Network)

Среди возможностей есть функции для получения состояний учетной записи, транзакций, отправки сообщений в блокчейн и запуска методов getmethods. Также имеется встроенный веб-сервер, и вы можете запустить собственный локальный аналог ton.sh или toncenter.com с помощью двух команд:

pip3 install pyTON
python3 -m pyTON

(требуется Python 3.7+)

Несмотря на то, что API веб-сервера близок к представленному на ton.sh, сервис pyTON более функционален. Нет ограничений для запрашиваемых транзакций, можно запросить все транзакции которые произошли после известной. Кроме того вы можете отправлять BOC's в сеть как в виде сериализованной ячейки, так и в формате объекта: {"data": {"b64": "...", "len": int}, "refs": [... subcells. ..]}. Также возможно включить API для запуска getMethods (хотя и не рекомендуется это делать для общедоступных серверов, поскольку возможен сбой litellient с помощью злонамеренно созданного getMethod).


Github: https://github.com/viewst/pyTON
 

manitu

New member
Сообщения
5
Лучшие ответы
0
Реакции
0
pyTON во многом основан на ton_client от formony и его функционал более направлен на взаимодействие с блокчейном Telegram Open Network. Есть возможность сделать запрос всех транзакций после известной. Поддерживается отправка как boc, так и несериализованных ячеек в object-формате. Есть API для получения результатов методов getMethod контрактов. В целом API pyTON позволяет полноценно настроить взаимодействие любого приложения с блокчейном TON (y)
 

arvkonstantin

New member
Сообщения
5
Лучшие ответы
0
Реакции
1
Подскажите, развернул pyTON, получать транзакции и прочее вообще без проблем, однако не понимаю, каким образом отправлять грамы можно?
 

manitu

New member
Сообщения
5
Лучшие ответы
0
Реакции
0
Переведу с вашего позволения


Отправка транзакции это, как правило, отправка специального сообщения в какой-либо контракт, который содержит Граммы и запрограммирован на отправку сообщения с граммами в ответ на ваше сообщение.
Если вы работаете со стандартным кошельком, вам нужно сделать следующее:


1. Создать финальное внутреннее сообщение: сообщение, которое ваш контракт отправит другому контракту. Код Fift можно найти здесь

Простой код, генерирующий такое же сообщение на Python, будет примерно таким:

Код:
from tvm_valuetypes import Cell
from math import ceil
internal_message = Cell()
internal_message.put_arbitrary_uint(0b01, 2)
internal_message.put_arbitrary_uint(bounce, 1)
internal_message.put_arbitrary_uint(0b000100, 6)
internal_message.put_uint8(workchain)
internal_message.put_arbitrary_uint(addr, 256)
gram_bytes_num = ceil(amount.bit_length()/8)
internal_message.put_arbitrary_uint(gram_bytes_num, 4)
internal_message.put_arbitrary_uint(amount, gram_bytes_num*8)
internal_message.put_arbitrary_uint(0, 9+64+32+1)
# put some payload to the message if you want here

2. Сгенерировать «внешнее» сообщение: сообщение, которое "заставит" вашу учетную запись отправить внутреннее сообщение. Код Fift

Код:
import nacl.signing
from tvm_valuetypes Cell

def sign_message(signing_key, cell):
      # 512 signature len
      # 279 message header len: <b b{1000100} s, wallet_addr addr, 0 Gram, b{00} s,
      if(cell.data.length()+ 512 + 279 > 1023):
        top_cell = Cell()
        top_cell.refs.append(cell)
        cell = top_cell
      signature = signing_key.sign(cell.hash())[:64]
      signed_cell = Cell()
      signed_cell.data.put_arbitrary_uint(int.from_bytes(signature, "big"), 512)
      signed_cell.concatenate(cell)
      return signed_cell

def compose_message(contract_address, signed_result):
  message_cell = Cell()
  #<b b{1000100} s, hub_addr addr, 0 Gram, b{00} s,
  message_cell.data.put_arbitrary_uint( 0b1000, 4)
  message_cell.data.put_arbitrary_uint( 0b100, 3) #$10 no anycast
  wc, addr = contract_address.split(":")
  wc=int(wc)
  message_cell.data.put_arbitrary_int(wc, 8)
  message_cell.data.put_arbitrary_uint(int('0x'+addr, 16), 256)
  message_cell.data.put_arbitrary_uint( 0, 6) # 0Gram = 0b0000, b{00}
  message_cell.concatenate(signed_result)
  return message_cell

external_message = Cell()
external_message.put_arbitrary_uint(seq_no,32)
external_message.put_uint8(sendmode)
external_message.refs.append(internal_message)
signing_key = nacl.signing.SigningKey(private_key)
signed_message = sing_message(signing_key, external_message)
ready_to_send_message = compose_message(contract_address, signed_message)

3. После чего отправить его в сеть используя, например, pyTON
 
Сверху