TON Дев Чат
0x00000000
) то считаем что это комментарий, и конвертируем следующие байты в строку, получаем комментарий в виде строки.{
"update_id": 932802274,
"message": {
"message_id": 1011405,
"from": {
"id": 750884262,
"is_bot": false,
"first_name": "Юра",
"username": "go_de",
"language_code": "ru"
},
"chat": {
"id": 750884262,
"first_name": "Юра",
"username": "go_de",
"type": "private"
},
"date": 1650712770,
"forward_from_chat": {
"id": -1001000499465,
"title": "ForkLog",
"username": "forklog",
"type": "channel"
},
"forward_from_message_id": 25152,
"forward_date": 1650641515,
"photo": [
{
"file_id": "AgACAgIAAxkBAAEPbs1iY-DCrTO2oui73GKSNu_8Ta1AYAACpLkxG24KGUuztbp_w9sfpQEAAwIAA3MAAyQE",
"file_unique_id": "AQADpLkxG24KGUt4",
"file_size": 608,
"width": 90,
"height": 43
},
{
"file_id": "AgACAgIAAxkBAAEPbs1iY-DCrTO2oui73GKSNu_8Ta1AYAACpLkxG24KGUuztbp_w9sfpQEAAwIAA20AAyQE",
"file_unique_id": "AQADpLkxG24KGUty",
"file_size": 6992,
"width": 320,
"height": 152
},
{
"file_id": "AgACAgIAAxkBAAEPbs1iY-DCrTO2oui73GKSNu_8Ta1AYAACpLkxG24KGUuztbp_w9sfpQEAAwIAA3gAAyQE",
"file_unique_id": "AQADpLkxG24KGUt9",
"file_size": 31205,
"width": 800,
"height": 381
},
{
"file_id": "AgACAgIAAxkBAAEPbs1iY-DCrTO2oui73GKSNu_8Ta1AYAACpLkxG24KGUuztbp_w9sfpQEAAwIAA3kAAyQE",
"file_unique_id": "AQADpLkxG24KGUt-",
"file_size": 52968,
"width": 1280,
"height": 610
}
],
"caption": "📉 К вечеру пятницы котировки биткоина вновь опустились ниже $40 000 — к уровню открытия недели.\n\n#forkstats",
"caption_entities": [
{
"offset": 98,
"length": 10,
"type": "hashtag"
}
]
}
}
D4p+pQAAAAAAAAAAMBJPiABzqSGyo2Dku3JPJioqJmbsH0IkZVtMPLtP4Rv3viSGSQAghRpmfs1Y\nze1DF3VDIxdoJ1AM/GEgGe3GFJV9+JmqEIBjNmVkZGY3My04MWUzLTQ2N2UtYTRlZC1hYjMxNzZl\nNmJiMDQ=\n
. Судя по всему, это надо разбивать по \n
, декодировать из base64, а дальше непонятно.
[ 4][t 1][2022-04-23 19:30:51.719207][TonlibClient.cpp:1419][!Tonlib][&tonlib_query id != 0] Tonlib answer query [id:4] FullAccountState {
address = AccountAddress {
accountAddress = "<REDACTED>"
}
balance = -1
lastTransactionId = InternalTransactionId {
lt = 0
hash = bytes [32] { 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 }
}
blockId = TonBlockIdExt {
workchain = -1
shard = -9223372036854775808
seqno = 10601721
rootHash = bytes [32] { REDACTED }
fileHash = bytes [32] { REDACTED }
}
syncUtime = 1650742241
accountState = UninitedAccountState {
frozenHash = bytes [0] { }
}
revision = 0
}
boolean
переменная, чтобы хранить, был ли сделан accept_message
tvm.pdf
"gas credit" встречается всего-лишь 3 раза во всём документе, и ни в одном из трёх его действие не описано (во всех трёх случаях он устанавливается в ноль)tvm.pdf
:tvm.pdf
всё-таки неправильная?
[...document.querySelectorAll('a')].filter(n => n.textContent.includes('accept'))
client.sendExternalMessage(contract: Contract, src: Cell)но он хочет слишком много параметров,
msg.writeTo(cell);
cell.toBoc
export const externalMessage = (body: Cell, address: Address) => new ExternalMessage({> Error caught: Error: Malformed response: Expecting "ok" at @type but instead got: "error"
to: address,
body: new CommonMessageInfo({
body: new CellMessage(body)
}),
});
...
const msg = externalMessage(msg_body, summatorAddress);
let c = cell();
msg.writeTo(c);
await client.sendFile(c.toBoc());
{
"ok": false,
"error": "Incorrect padding",
"code": 503
}
{
"ok": true,
"result": {
"@type": "error",
"code": 400,
"message": "INVALID_BAG_OF_CELLS: bodycannot deserialize bag-of-cells: invalid header, error 0",
"@extra": "1650840228.2516418:1:0.5788688475357345"
}
}
b5ee9c724101010100350000...Не работает
\xb5\xee\x9c\x72\x41\x01\x01\x01\x00\x35\x00...Также не работает
await this.doCall('sendBoc', { boc: body.toString('base64') }, bocResponse);
msg.importFee
writeTo(cell: Cell) {
cell.bits.writeUint(2, 2);
cell.bits.writeAddress(this.from);
cell.bits.writeAddress(this.to);
cell.bits.writeCoins(this.importFee);
this.body.writeTo(cell);
importFee
- это не стоимость импорта данных на блокчейн, рассчитанная исходя из количества данных и стоимости газа, а ... свойство сообщения, которое мы задаём ? 😧
await testGet();
await testAdd(1, 2);
await testAdd(20, 30, 40);
await testAdd(100, 102, 200, 105, 108);
await testAdd(4009, 1003, 1005, 1010);
await testGet();
test_data
(выполняющаяся до) и test_check
(выполняющаяся после) с автоматическим вызовом контракта между ними, а одна, которая делает всё:int test() {
var body = begin_cell().store_uint(3, 32).end_cell().begin_parse();
var data = begin_cell().end_cell();
var (exit_code, action_list, ...) = contract.sendInternalMessage(data, body);
if (exit_code != 0) return exit_code;
...
return 0;
}
_ test() {
var f1 = testGet();
var f2 = testAdd(1, 2);
var f3 = testAdd(20, 30, 40);
var f4 = testAdd(100, 102, 200, 105, 108);
var f5 = testAdd(4009, 1003, 1005, 1010);
var f6 = testGet();
return [f1, f2, f3, f4, f5, f6];
}
await
- это чисто причуда JavaScript'а, поэтому его не надо реализовывать:) Я просто скопировал мой код из JavaScript тестов. Без него код будет ещё короче и чище:testGet();
testAdd(1, 2);
testAdd(20, 30, 40);
testAdd(100, 102, 200, 105, 108);
testAdd(4009, 1003, 1005, 1010);
testGet();
const { gas_consumed } = result;т.е. написав дополнительную строчку,
...
console.log(`testAdd(${value}) passed, value = ${storedNum.toString(10)}, gas = ${gas_consumed}`);
.sendInternalMessage
параметр, который будет отвечать за автоматическую печать логов
(slice, slice, slice, slice, slice, int) third_1b_params() inline method_id
[int, tuple, cell, tuple, int] third_1c_data() method_id(20) {
return request_address_test_data(third_1c_params);
}
_ third_1c_check(int exit_code, cell data, tuple stack, cell actions, int gas) method_id(21) {
request_address_test_check(third_1c_params, exit_code, data, stack, actions, gas);
}
tvm.pdf
, ни она не отображается в explorer'е:boc length: 50057
blocks.getTransactions id:ton.blockIdExt mode:# count:# after:blocks.accountTransactionId = blocks.Transactions;А какое может быть максимальное количество транзакций в одном блоке?
Мастерчейн используется для создания сильной связности между воркчейнами и шардчейнами. Это позволяет не ожидать Х подтверждений блока в отличие от слабо связных систем типа EOS. То есть любой блок шардчейна включенный в мастерчейн сразу же считается неизменяемым [whitepaper, С. 9, п. 2.1.13].а далее следующее:
Исправление невалидных блоков достигается путём добавления исправленного блока в «вертикальный блокчейн», затем должны быть обновлены все блоки ссылающиеся на данный блок, что вызывает эффект «ряби»: изменения распространяются от невалидного блока вверх до самого последнего блока. После чего эти изменения должны быть отраженны в новом вертикальном блоке мастерчейна [whitepaper, С. 12, п. 2.1.17].Получается, что действие в реальном мире (например: начисление денег на карту) можно совершать только после того как ставки валидаторов разморожены, так как по факту состояние может изменится из-за исправления невалидных блоков. Верно я понимаю? Или всё-таки есть ограничения, что может быть исправлено? Вместо Х подтверждений нам придется при текущих настройках ожидать день - два...
runmethodfull 0:a44757069a7b04e393782b4a2d3e5e449f19d16a4986a9e25436e6b97e45a16a get_members
//
// codepage primitives
x{FF00} @Defop SETCP0
x{FFF0} @Defop SETCPX
{ dup -14 239 @-range abort"codepage out of range"
255 and <b x{FF} s, swap 8 u, @addopb
} : SETCP
import * as React from 'react';
import { NextPage } from 'next';
import Head from 'next/head';
import { Cell } from 'ton';
const Page: NextPage = props => {
const [value, setValue] = React.useState('');
const [boc, setBoc] = React.useState<{
cell: string,
hash: Buffer
} | null>(null);
React.useEffect(() => {
let ended = false;
(async () => {
try {
let cell = Cell.fromBoc(Buffer.from(value, 'base64'))[0];
if (ended) {
return;
}
setBoc({
cell: cell.toString(),
hash: await cell.hash()
});
} catch (e) {
if (ended) {
return;
}
setBoc(null);
}
})();
return () => {
ended = true;
}
}, [value]);
return (
<>
<Head>
<title>Boc Parser</title>
<meta name="description" content="Richest people on TON" />
</Head>
<h1>BOC Parser</h1>
<textarea
value={value}
onChange={e => setValue(e.target.value)}
style={{
height: 300,
}}
/>
{!boc && <h2>Invalid boc</h2>}
{boc && <h2>Parsed BOC</h2>}
{boc && <pre>{boc.hash.toString('hex')}</pre>}
{boc && <pre>{boc.cell}</pre>}
</>
);
};
export default Page;
{
"ok": true,
"result": "1916839284"
}
Через TON Wallet показывает 1.12299928 TON.1916839284
получить 1.12299928
?
"B5EE9C724101010100710000DEFF0020DD2082014C97BA218201339CBAB19F71B0ED44D0D31FD31F31D70BFFE304E0A4F2608308D71820D31FD31FD31FF82313BBF263ED44D0D31FD31FD3FFD15132BAF2A15144BAF2A204F901541055F910F2A3F8009320D74A96D307D402FB00E8D101A4C8CB1FCB1FCBFFC9ED5410BD6DAD"
set_code()
, то, да - это будет уже другой контракт, а если новый код также "подходит", то можно и его байткод занести в "словарь", который будет указывать на тот же контракт
/getWalletInformation
возвращает ключ "wallet" = true. Все понятно, это кошелек. Там же есть ключ, чтобы узнать тип кошелька.https://api.ton.cat/v2/explorer/nft/address/YOUR_ADDRESS_HERE
и по ключу "type" будет понятно NFT Item это или NFT Collection, а также увидеть всю информацию по ним.
/runGetMethod
? Что указывается в ключах "method" и "stack"?
{
"address": "UQC6CwW_39axECOzmeQ34QToTZ0SnX1N0nU05djAi-C8V2gM",
"method": "get_nft_data",
"stack": [ ]
}
get_nft_data
этот метод у всех смарт-контрактов есть, стандартный метод?
saveaccountdata bigdata.data EQCuzvIOXLjH2tv35gY4tzhIvXCqZWDuK9kUhFGXKLImgxT5
written data of account 0:AECEF20E5CB8C7DADBF7E60638B73848BD70AA6560EE2BD91484519728B22683 to file `bigdata.data` (994783 bytes)
data = bytes [994783] { B5 EE 9C 72 42 03 4E ED 00 01 00 00 0F 2D CA 00 00 01 01 C0 00 01 02 01 20 00 02 00 03 02 01 20 00 04 00 05 02 01 20 28 77 28 78 02 01 20 00 06 00 07 02 01 20 14 71 14 72 02 01 20 00 08 00 09 ...}
tonweb.getTransactions(address: Address | string, limit?: number, lt?: number, txhash?: string, lt_to?: number)
Можно ли получить всё транзакции после lt и до текущего момента?nft-collection.fc
, прочитать royalty_params
royalty_address
и royalty_amount
при деплое контракта продажи nft-sale.fc
02
95 000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c46
000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c4
[0]95
, второй дескриптор d2, это не длина. Это Math.ceil(bitlength / 8) + Math.floor(bitlength / 8);
const dataBytesize = Math.ceil(d2 / 2);
const fullfilledBytes = !(d2 % 2);
000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c460
000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c46_
0110
, т.е. учитывая что мы знаем что это неполный байт значащие там только 01
, а 10
или 100000
это просто конец строки
000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c46
000000000000000080051eec1b065126304253957c14810c949f9902ec722d1aa47adb690497b32f7cd0027e457611181313ddf9812a3ef5d3b9dcf80c7f1bdb9ff8d57fc9e74a3ce93c4
() recv_internal(int msg_value, cell in_msg_cell, slice in_msg)
send_raw_message
это получается происходит запись этой транзакции в блокчейн?
if (op == 0) { ;; simple send
while (cs.slice_refs()) {
var mode = cs~load_uint(8);
send_raw_message(cs~load_ref(), mode);
}
return (); ;; have already saved the storage
}