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

admin

Administrator
Команда форума
Сообщения
650
Реакции
190
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
pyTON во многом основан на ton_client от formony и его функционал более направлен на взаимодействие с блокчейном Telegram Open Network. Есть возможность сделать запрос всех транзакций после известной. Поддерживается отправка как boc, так и несериализованных ячеек в object-формате. Есть API для получения результатов методов getMethod контрактов. В целом API pyTON позволяет полноценно настроить взаимодействие любого приложения с блокчейном TON (y)
 

arvkonstantin

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

manitu

New member
Сообщения
5
Реакции
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
 
Сверху