Solidity

減小 ABI 文件的大小

  • May 14, 2020

我有一些 Truffle 和 Solidity 生成的 ABI 文件,我將它們與 JavaScript NPM 包捆綁在一起。

221.7kB esm5/lib/abi/IERC777.json   

目前,ABI 文件包含完整的詳細資訊,例如字節碼,因為這些文件由 Truffle 本身用於單元測試、部署等。但是基於 JavaScript 的使用者界麵包只需要abi函式定義本身,沒有別的。

如何從不必要的數據中去除 ABI 文件並減少下載大小?

感謝@goodvibration 指出選項#2 方法。

我製作了這個 shell 腳本,它使用jq命令來處理 ABI 文件。

我還細化了密鑰列表,刪除了一些內容。

#!/bin/bash
#
# Remove unnecessary cruft from ABI files
#
# Uses JQ: https://stedolan.github.io/jq/
#
# https://ethereum.stackexchange.com/questions/83299/decreasing-the-size-of-abi-files
#
# https://stackoverflow.com/questions/48529016/remove-a-keyvalue-from-an-json-object-using-jq
#

set -e

for abi in src/lib/abi/*.json ; do
 echo "Shrinking $abi"

 # Truffle compile generates this data by default
 # These are only necessary when deploying the contract or verifying it on EtherScan
 # cat trick: https://stackoverflow.com/a/60744617/315168
 cat <<< $(jq 'delpaths([["ast"], ["metadata"], ["source"], ["legacyAST"], ["devdoc"]])' $abi) > $abi
done

選項 #1 - 使用 solc 執行檔直接編譯您的程式碼,例如:

solc --bin --abi --optimize --optimize-runs=200 --output-dir=artifacts MyContract.sol

選項 #2 - 從 truffle 或 solc.js 的輸出中提取工件:

const fs = require("fs");

const INPUT_DIR  = "YourJsonFilesDirectory";
const OUTPUT_DIR = "YourArtifactsDirectory";

for (const fileName of fs.readdirSync(INPUT_DIR)) {
   const data = JSON.parse(fs.readFileSync(INPUT_DIR + fileName, {encoding: "utf8"}));
   fs.writeFileSync(OUTPUT_DIR + fileName.replace(".json", ".abi"), JSON.stringify(data.abi)  , {encoding: "utf8"});
   fs.writeFileSync(OUTPUT_DIR + fileName.replace(".json", ".bin"), data.bytecode.substring(2), {encoding: "utf8"});
}

引用自:https://ethereum.stackexchange.com/questions/83299