TVM 업그레이드 2024.04
저렴한 요금 계산을 위한 새로운 지침 소개
이 업그레이드는 3월 16일부터 메인넷에서 활성화되었습니다(https://t.me/tonstatus/101 참조). 이 블루프린트 업데이트의 미리보기는 @ton/sandbox@0.16.0-tvmbeta.3
, @ton-community/func-js@0.6.3-tvmbeta.3
, @ton-community/func-js-bin@0.4.5-tvmbeta.3
패키지에서 확인할 수 있습니다.
이 업데이트는 Config8 버전
>= 6으로 활성화됩니다.
c7
C7 튜플이 14개 요소에서 16개 요소로 확장되었습니다:
- 14: 일부 구성 매개변수를 셀 슬라이스로 포함하는 튜플입니다. 매개변수가 구성에 없는 경우 값은 null입니다.
- 0: '구성 매개변수 18'의
StoragePrices
. 전체 딕셔너리가 아니라 현재 시간에 해당하는 StoragePrices 항목 하나만 가져옵니다. - 1: '컨피그파람 19'(글로벌 ID).
- 2: '구성 매개 변수 20'(mc 가스 가격).
- 3: '구성 매개변수 21'(가스 가격).
- 4: '구성 매개변수 24'(mc fwd 수수료).
- 5: '구성 매개변수 25'(전진 수수료).
- 6: '구성 매개변수 43'(크기 제한).
- 0: '구성 매개변수 18'의
- 15: "due payment" - 스토리지 요금에 대한 현재 부채(나노톤). ASM 연산자:
듀페이먼트
. - 16: "사전 컴파일된 가스 사용량" - 현재 계약의 가스 사용량이 사전 컴파일된 경우(ConfigParam 45 참조), 그렇지 않은 경우 null입니다. Asm 옵코드: getprecompiledgas`.
이 데이터는 트랜잭션 실행자에 의해 글로벌 구성에서 검색되므로 이미 실행자의 메모리에 표시되어 있으므로, 언패킹된 구성 매개변수에 의한 c7의 확장 아이디어는 다음과 같습니다. 그러나 (확장 전) 스마트 컨트랙트는 이러한 모든 파라미터를 구성 사전에서 하나씩 가져와야 하는데, 이는 비용이 많이 들고 잠재적으로 가스가 예측할 수 없습니다(비용은 파라미터의 수에 따라 달라지기 때문입니다).
스마트 컨트랙트에 디폴트(반송 가능) 모드로 메시지를 전송하면 저장소 수수료가 공제(또는 저장소 수수료 관련 부채가 포함된 due_payment 필드에 추가)되기 전에 메시지 값이 잔액에 추가됩니다. 따라서 메시지 처리 후 컨트랙트가 모드=64로 가스 초과분을 다시 보내면, 이는 컨트랙트 잔액이 0에 도달하면 다음 트랜잭션에서 스토리지 수수료가 due_payment에서 발생하기 시작한다는 의미입니다(수신 메시지에서 차감되지 않음). 이렇게 하면 계정이 동결될 때까지 부채가 조용히 누적됩니다. '기한지급'을 사용하면 개발자가 스토리지 수수료를 명시적으로 계정/보류할 수 있으므로 문제를 방지할 수 있습니다.
새로운 옵코드
새로운 c7 값으로 작동하는 옵코드
26개 가스(셀 작업으로 인해 SENDMSG
를 제외).
xxxxxxxxxxxxxxxxxx 다섯 번째 구문 | xxxxxxxxx 스택 | xxxxxxxxxxxxxxxxxxxxxxxxxxx 설명 |
---|---|---|
unpackedconfigtuple | - c | c7에서 구성 조각의 튜플을 검색합니다. |
연체료 | - i | C7에서 만기 결제 금액을 검색합니다. |
GLOBALID | - i | 이제 c7, 톤 형식의 구성 딕셔너리에서 ConfigParam 19 를 검색합니다. |
SENDMSG | MSG 모드 - i | 이제 구성 딕트가 아닌 c7에서 ConfigParam 24/25 (메시지 가격) 및 ConfigParam 43 (max_msg_cells )을 검색합니다. |
구성 매개변수를 처리하는 옵코드
TON 트랜잭션 실행기에 구성 슬라이스 튜플이 도입되면서 수수료 매개변수를 파싱하는 것이 더 비용 효율적이 되었습니다. 그러나 향후 새로운 구성 매개변수 생성자가 도입될 수 있으므로, 이러한 새로운 매개변수를 해석하기 위해 스마트 컨트랙트를 업데이트해야 할 수도 있습니다. 이 문제를 해결하기 위해 수수료 계산을 위한 특수 연산 코드가 도입되었습니다. 이 옵코드는 c7에서 매개변수를 읽고 실행자와 동일한 방식으로 수수료를 계산합니다. 새로운 매개변수 생성자가 도입되면 이러한 옵코드는 변경 사항을 수용하도록 업데이트될 것입니다. 이를 통해 스마트 콘트랙트는 모든 유형의 생성자를 해석할 필요 없이 수수료 계산을 위해 이러한 지침에 의존할 수 있습니다.
각각 26개씩.
xxxxxxxxxxxxxxxxxx 다섯 번째 구문 | xxxxxxxxx 스택 | 설명 |
---|---|---|
GETGASFEE | 가스_사용된 is_mc - 가격 | 가스를 소비하는 트랜잭션의 계산 비용을 나노톤 단위로 계산합니다(가스_사용 ). |
getstoragefee | 셀 비트 초 is_mc - 가격 | 현재 스토리지 가격을 기준으로 계약에 대한 나노톤 단위의 스토리지 요금을 계산합니다. 셀과 비트는 [ AccountState`](https://github.com/ton-blockchain/ton/blob/8a9ff339927b22b72819c5125428b70c406da631/crypto/block/block.tlb#L247)의 크기입니다(중복 제거, 루트 셀 포함). |
겟포워드피 | 셀 비트 is_mc - 가격 | 발신 메시지에 대한 전달 수수료를 나노톤 단위로 계산합니다. 소스 또는 목적지가 마스터체인에 있으면 is_mc 가 참이고, 둘 다 베이스체인에 있으면 거짓입니다. 메시지의 셀과 비트는 중복 제거 및 root-is-not-counted 규칙을 고려하여 계산해야 합니다. |
getprecompiledgas | - null | 예약된 경우, 현재 null 을 반환합니다. 이 컨트랙트가 사전 컴파일된 경우 가스 단위의 컨트랙트 실행 비용을 반환합니다. |
getoriginalfwdfee | FWD_FEE IS_MC - ORIG_FWD_FEE | fwdfee * 2^16 / first_frac을 계산합니다. 수신 메시지에서 파싱한 fwd_fee에서 메시지의 원래 fwd_fee`를 가져오는 데 사용할 수 있습니다(this 같은 하드코딩된 값 대신). 소스 또는 목적지가 마스터체인에 있으면 is_mc\ _가 참이고, 둘 다 베이스체인에 있으면 거짓입니다. |
getgasfeesimple | 가스_사용된 is_mc - 가격 | 추가 `가스사용`을 소비하는 트랜잭션에 대한 추가 계산 비용을 나노톤 단위로 계산합니다. 즉, GETGASFEE와 동일하지만 고정 가격이 없습니다(단지 (gas_used * 가격) / 2^16`). |
겟포워드요금심플 | 셀 비트 is_mc - 가격 | 추가 셀 및 비트 가 포함된 메시지에 대한 추가 전달 비용을 나노톤 단위로 계산합니다. 즉, GETFORWARDFEE 와 동일하지만 일괄 가격이 없습니다(단지 (비트*비트_가격 + 셀*셀_가격)/2^16 ). |
가스 사용량,
셀,
비트,
시간 델타는
0..2^63-1` 범위의 정수입니다.
셀 수준 작업
셀이 0이 아닌 레벨과 여러 개의 해시를 가질 수 있는 머클 증명 작업을 위한 연산입니다. 각각에 대해 26개의 가스가 필요합니다.
xxxxxxxxxxxxxxxxxx 다섯 번째 구문 | xxxxxxxxx 스택 | 설명 |
---|---|---|
CLEVEL | 셀 - 레벨 | 셀의 레벨을 반환합니다. |
레벨 마스크` | 셀 - 레벨_마스크 | 셀의 레벨 마스크를 반환합니다. |
i CHASHI | 셀 - 해시 | 셀의 i 번째 해시를 반환합니다. |
i CDEPTHI | 셀 - 깊이 | 셀의 'i'번째 깊이를 반환합니다. |
CHASHIX | 셀 I - 깊이 | 셀의 i 번째 해시를 반환합니다. |
CDEPTHIX | 셀 I - 깊이 | 셀의 'i'번째 깊이를 반환합니다. |
i가
0..3` 범위에 있습니다.