Solidity
減小 ABI 文件的大小
我有一些 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"}); }