tip-268.md
April 3, 2025 ยท View on GitHub
tip: 268
title: SmartContract ABI optimization
author: yanghang8612 <yanghang8612@163.com>
status: Final
type: Standards Track
category: VM
created: 2021-05-19
Simple Summary
Move ABI out of SmartContract and store it in a new ABI store.
Motivation
The ABI field is totally indeed when the TVM executing SmartContract. Moving out ABI can reduce execution time of some opcodes such as EXTCODEHASH SLOAD SSTORE ISCONTRACT CREATE and CREATE2.
Specifications
ABI Store
Add a new store called ABI Store. The data stored in it is like below.
message ABI {
message Entry {
enum EntryType {
UnknownEntryType = 0;
Constructor = 1;
Function = 2;
Event = 3;
Fallback = 4;
Receive = 5;
}
message Param {
bool indexed = 1;
string name = 2;
string type = 3;
}
enum StateMutabilityType {
UnknownMutabilityType = 0;
Pure = 1;
View = 2;
Nonpayable = 3;
Payable = 4;
}
bool anonymous = 1;
bool constant = 2;
string name = 3;
repeated Param inputs = 4;
repeated Param outputs = 5;
EntryType type = 6;
bool payable = 7;
StateMutabilityType stateMutability = 8;
}
repeated Entry entrys = 1;
}
Rationale
Deploy Smart Contract
While committing contract cache, save ABI of the deployed contract to the ABI store, clear the ABI field of contract and save it to the Contract store.
Determine if constant
Get the ABI of contract in ABI store.
Implementation
When tron clients start, traverse all contracts in store and save every contract`s ABI to the ABI store. While doing this operation, clear the ABI field of contract and update the contract to store.
class MoveAbiHelper
def do_traverse_work() -> None:
for contract in contract_store:
if !abi_store.has(contract.address):
abi_store.save(contract.getABI())
contract.clear(field.ABI)
contract_store.save(contract)
assert contract_store.total() == abi_store.total()
Backwards Compatibility
No known backward compatibility issues.
Copyright
Copyright and related rights waived via CC0.