mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Disable anycast address, allow deploying with "fixed prefix length"
This commit is contained in:
parent
44e7e091b2
commit
61862c07c5
11 changed files with 241 additions and 157 deletions
|
@ -1380,10 +1380,13 @@ int exec_store_var_integer(VmState* st, int len_bits, bool sgnd, bool quiet) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool skip_maybe_anycast(CellSlice& cs) {
|
||||
bool skip_maybe_anycast(CellSlice& cs, int global_version) {
|
||||
if (cs.prefetch_ulong(1) != 1) {
|
||||
return cs.advance(1);
|
||||
}
|
||||
if (global_version >= 10) {
|
||||
return false;
|
||||
}
|
||||
unsigned depth;
|
||||
return cs.advance(1) // just$1
|
||||
&& cs.fetch_uint_leq(30, depth) // anycast_info$_ depth:(#<= 30)
|
||||
|
@ -1391,7 +1394,7 @@ bool skip_maybe_anycast(CellSlice& cs) {
|
|||
&& cs.advance(depth); // rewrite_pfx:(bits depth) = Anycast;
|
||||
}
|
||||
|
||||
bool skip_message_addr(CellSlice& cs) {
|
||||
bool skip_message_addr(CellSlice& cs, int global_version) {
|
||||
switch ((unsigned)cs.fetch_ulong(2)) {
|
||||
case 0: // addr_none$00 = MsgAddressExt;
|
||||
return true;
|
||||
|
@ -1400,15 +1403,18 @@ bool skip_message_addr(CellSlice& cs) {
|
|||
return cs.fetch_uint_to(9, len) // len:(## 9)
|
||||
&& cs.advance(len); // external_address:(bits len) = MsgAddressExt;
|
||||
}
|
||||
case 2: { // addr_std$10
|
||||
return skip_maybe_anycast(cs) // anycast:(Maybe Anycast)
|
||||
&& cs.advance(8 + 256); // workchain_id:int8 address:bits256 = MsgAddressInt;
|
||||
case 2: { // addr_std$10
|
||||
return skip_maybe_anycast(cs, global_version) // anycast:(Maybe Anycast)
|
||||
&& cs.advance(8 + 256); // workchain_id:int8 address:bits256 = MsgAddressInt;
|
||||
}
|
||||
case 3: { // addr_var$11
|
||||
if (global_version >= 10) {
|
||||
return false;
|
||||
}
|
||||
unsigned len;
|
||||
return skip_maybe_anycast(cs) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_uint_to(9, len) // addr_len:(## 9)
|
||||
&& cs.advance(32 + len); // workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
|
||||
return skip_maybe_anycast(cs, global_version) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_uint_to(9, len) // addr_len:(## 9)
|
||||
&& cs.advance(32 + len); // workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
|
@ -1420,7 +1426,7 @@ int exec_load_message_addr(VmState* st, bool quiet) {
|
|||
Stack& stack = st->get_stack();
|
||||
auto csr = stack.pop_cellslice();
|
||||
td::Ref<CellSlice> addr{true};
|
||||
if (util::load_msg_addr_q(csr.write(), addr.write(), quiet)) {
|
||||
if (util::load_msg_addr_q(csr.write(), addr.write(), st->get_global_version(), quiet)) {
|
||||
stack.push_cellslice(std::move(addr));
|
||||
stack.push_cellslice(std::move(csr));
|
||||
if (quiet) {
|
||||
|
@ -1433,11 +1439,14 @@ int exec_load_message_addr(VmState* st, bool quiet) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool parse_maybe_anycast(CellSlice& cs, StackEntry& res) {
|
||||
bool parse_maybe_anycast(CellSlice& cs, StackEntry& res, int global_version) {
|
||||
res = StackEntry{};
|
||||
if (cs.prefetch_ulong(1) != 1) {
|
||||
return cs.advance(1);
|
||||
}
|
||||
if (global_version >= 10) {
|
||||
return false;
|
||||
}
|
||||
unsigned depth;
|
||||
Ref<CellSlice> pfx;
|
||||
if (cs.advance(1) // just$1
|
||||
|
@ -1450,7 +1459,7 @@ bool parse_maybe_anycast(CellSlice& cs, StackEntry& res) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool parse_message_addr(CellSlice& cs, std::vector<StackEntry>& res) {
|
||||
bool parse_message_addr(CellSlice& cs, std::vector<StackEntry>& res, int global_version) {
|
||||
res.clear();
|
||||
switch ((unsigned)cs.fetch_ulong(2)) {
|
||||
case 0: // addr_none$00 = MsgAddressExt;
|
||||
|
@ -1471,9 +1480,9 @@ bool parse_message_addr(CellSlice& cs, std::vector<StackEntry>& res) {
|
|||
StackEntry v;
|
||||
int workchain;
|
||||
Ref<CellSlice> addr;
|
||||
if (parse_maybe_anycast(cs, v) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_int_to(8, workchain) // workchain_id:int8
|
||||
&& cs.fetch_subslice_to(256, addr)) { // address:bits256 = MsgAddressInt;
|
||||
if (parse_maybe_anycast(cs, v, global_version) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_int_to(8, workchain) // workchain_id:int8
|
||||
&& cs.fetch_subslice_to(256, addr)) { // address:bits256 = MsgAddressInt;
|
||||
res.emplace_back(td::make_refint(2));
|
||||
res.emplace_back(std::move(v));
|
||||
res.emplace_back(td::make_refint(workchain));
|
||||
|
@ -1483,13 +1492,16 @@ bool parse_message_addr(CellSlice& cs, std::vector<StackEntry>& res) {
|
|||
break;
|
||||
}
|
||||
case 3: { // addr_var$11
|
||||
if (global_version >= 10) {
|
||||
return false;
|
||||
}
|
||||
StackEntry v;
|
||||
int len, workchain;
|
||||
Ref<CellSlice> addr;
|
||||
if (parse_maybe_anycast(cs, v) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_uint_to(9, len) // addr_len:(## 9)
|
||||
&& cs.fetch_int_to(32, workchain) // workchain_id:int32
|
||||
&& cs.fetch_subslice_to(len, addr)) { // address:(bits addr_len) = MsgAddressInt;
|
||||
if (parse_maybe_anycast(cs, v, global_version) // anycast:(Maybe Anycast)
|
||||
&& cs.fetch_uint_to(9, len) // addr_len:(## 9)
|
||||
&& cs.fetch_int_to(32, workchain) // workchain_id:int32
|
||||
&& cs.fetch_subslice_to(len, addr)) { // address:(bits addr_len) = MsgAddressInt;
|
||||
res.emplace_back(td::make_refint(3));
|
||||
res.emplace_back(std::move(v));
|
||||
res.emplace_back(td::make_refint(workchain));
|
||||
|
@ -1508,7 +1520,7 @@ int exec_parse_message_addr(VmState* st, bool quiet) {
|
|||
auto csr = stack.pop_cellslice();
|
||||
auto& cs = csr.write();
|
||||
std::vector<StackEntry> res;
|
||||
if (!(parse_message_addr(cs, res) && cs.empty_ext())) {
|
||||
if (!(parse_message_addr(cs, res, st->get_global_version()) && cs.empty_ext())) {
|
||||
if (quiet) {
|
||||
stack.push_bool(false);
|
||||
} else {
|
||||
|
@ -1548,7 +1560,7 @@ int exec_rewrite_message_addr(VmState* st, bool allow_var_addr, bool quiet) {
|
|||
auto csr = stack.pop_cellslice();
|
||||
auto& cs = csr.write();
|
||||
std::vector<StackEntry> tuple;
|
||||
if (!(parse_message_addr(cs, tuple) && cs.empty_ext())) {
|
||||
if (!(parse_message_addr(cs, tuple, st->get_global_version()) && cs.empty_ext())) {
|
||||
if (quiet) {
|
||||
stack.push_bool(false);
|
||||
return 0;
|
||||
|
@ -2026,9 +2038,9 @@ bool load_var_integer_q(CellSlice& cs, td::RefInt256& res, int len_bits, bool sg
|
|||
bool load_coins_q(CellSlice& cs, td::RefInt256& res, bool quiet) {
|
||||
return load_var_integer_q(cs, res, 4, false, quiet);
|
||||
}
|
||||
bool load_msg_addr_q(CellSlice& cs, CellSlice& res, bool quiet) {
|
||||
bool load_msg_addr_q(CellSlice& cs, CellSlice& res, int global_version, bool quiet) {
|
||||
res = cs;
|
||||
if (!skip_message_addr(cs)) {
|
||||
if (!skip_message_addr(cs, global_version)) {
|
||||
cs = res;
|
||||
if (quiet) {
|
||||
return false;
|
||||
|
@ -2038,10 +2050,11 @@ bool load_msg_addr_q(CellSlice& cs, CellSlice& res, bool quiet) {
|
|||
res.cut_tail(cs);
|
||||
return true;
|
||||
}
|
||||
bool parse_std_addr_q(CellSlice cs, ton::WorkchainId& res_wc, ton::StdSmcAddress& res_addr, bool quiet) {
|
||||
bool parse_std_addr_q(CellSlice cs, ton::WorkchainId& res_wc, ton::StdSmcAddress& res_addr, int global_version,
|
||||
bool quiet) {
|
||||
// Like exec_rewrite_message_addr, but for std address case
|
||||
std::vector<StackEntry> tuple;
|
||||
if (!(parse_message_addr(cs, tuple) && cs.empty_ext())) {
|
||||
if (!(parse_message_addr(cs, tuple, global_version) && cs.empty_ext())) {
|
||||
if (quiet) {
|
||||
return false;
|
||||
}
|
||||
|
@ -2076,14 +2089,14 @@ td::RefInt256 load_var_integer(CellSlice& cs, int len_bits, bool sgnd) {
|
|||
td::RefInt256 load_coins(CellSlice& cs) {
|
||||
return load_var_integer(cs, 4, false);
|
||||
}
|
||||
CellSlice load_msg_addr(CellSlice& cs) {
|
||||
CellSlice load_msg_addr(CellSlice& cs, int global_version) {
|
||||
CellSlice addr;
|
||||
load_msg_addr_q(cs, addr, false);
|
||||
load_msg_addr_q(cs, addr, global_version, false);
|
||||
return addr;
|
||||
}
|
||||
std::pair<ton::WorkchainId, ton::StdSmcAddress> parse_std_addr(CellSlice cs) {
|
||||
std::pair<ton::WorkchainId, ton::StdSmcAddress> parse_std_addr(CellSlice cs, int global_version) {
|
||||
std::pair<ton::WorkchainId, ton::StdSmcAddress> res;
|
||||
parse_std_addr_q(std::move(cs), res.first, res.second, false);
|
||||
parse_std_addr_q(std::move(cs), res.first, res.second, global_version, false);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue