首先简单了解下 EOSIO 区块链数据存储:
.
├── blocks
│ ├── blocks.index // 区块索引文件
│ ├── blocks.log // 所有不可逆区块
│ └── reversible
│ └── shared_memory.bin // 可逆区块目录,保存刚打包的待确权区块
├── snapshots
└── state
└── shared_memory.bin // 合约状态数据库
blocks
: 保存区块数据state
: 状态数据库, 也就是合约的数据库
shared_memory.bin
是内存映射的。
为什么现在主网创建一个 EOSIO 账户需要购买大约 1600 bytes
左右的 ram
const static uint32_t overhead_per_account_ram_bytes = 2*1024; ///< overhead accounts for basic account storage and pre-pays features like account recovery
...
// https://github.com/EOSIO/eos/blob/master/libraries/chain/eosio_contract.cpp#L115
int64_t ram_delta = config::overhead_per_account_ram_bytes; // 硬编码的 2048 bytes,
ram_delta += 2*config::billable_size_v<permission_object>; // 2*288 bytes
ram_delta += owner_permission.auth.get_billable_size(); // 一般 50 bytes
ram_delta += active_permission.auth.get_billable_size(); // 一般 50 bytes