每条Arbitrum链都包含了原生的、预编译的Address Table Registry合约。该合约允许用户注册一个地址,并将其映射至某些索引上,可用来检索地址,以节省calldata字节。
接口如下:
/** @title Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000066.
* Allows registering / retrieving addresses at uint indices, saving calldata.
*/
interface ArbAddressTable {
/**
* @notice Register an address in the address table
* @param addr address to register
* @return index of the address (existing index, or newly created index if not already registered)
*/
function register(address addr) external returns(uint);
/**
* @param addr address to lookup
* @return index of an address in the address table (revert if address isn't in the table)
*/
function lookup(address addr) external view returns(uint);
/**
* @notice Check whether an address exists in the address table
* @param addr address to check for presence in table
* @return true if address is in table
*/
function addressExists(address addr) external view returns(bool);
/**
* @return size of address table (= first unused index)
*/
function size() external view returns(uint);
/**
* @param index index to lookup address
* @return address at a given index in address table (revert if index is beyond end of table)
*/
function lookupIndex(uint index) external view returns(address);
/**
* @notice read a compressed address from a bytes buffer
* @param buf bytes buffer containing an address
* @param offset offset of target address
* @return resulting address and updated offset into the buffer (revert if buffer is too short)
*/
function decompress(bytes calldata buf, uint offset) external pure returns(address, uint);
/**
* @notice compress an address and return the result
* @param addr address to compress
* @return compressed address bytes
*/
function compress(address addr) external returns(bytes memory);
}
用例请见Arbiswap Demo。
一般来说,L1的calldata是Arbitrum交易的主要燃气成本。所以如果你想在Arbitrum上优化合约的燃气成本,可以尽量减少calldata的使用。
对大部分合约来说,可接受的一种方法是,将函数的参数替换为序列化的字节数组,再让合约对数据进行反序列化。
arb-ts中有序列化的方法(以及与Address Table合约互动的方法)。
用例请见Arbiswap Demo:
为实现特定功能,Arbitrum有几个预编译合约:
合约 | 地址 |
---|---|
ArbSys | 0x0000000000000000000000000000000000000064 |
ArbRetryableTx | 0x000000000000000000000000000000000000006E |
ArbGasInfo | 0x000000000000000000000000000000000000006C |
NodeInterface | 0x00000000000000000000000000000000000000C8 |
ArbStatistics | 0x000000000000000000000000000000000000006F |
← 总览