You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从合约创建字节码提取含int数组的构造函数参数以完成部署验证?

Extracting the foodVote(int[]) Constructor Parameter from Contract Creation Bytecode

Got it, let's break down how to pull that int[] constructor parameter from your contract creation bytecode—this is a super common pain point when deploying and verifying contracts, so I'll walk you through every step clearly.

First, a quick recap: The "contract creation bytecode" you're working with is actually the full transaction input data, which has two parts:

  • The creation bytecode (the code that runs to deploy your contract and return the runtime bytecode)
  • The ABI-encoded constructor parameters, tacked onto the end.

Step 1: Split the Parameter Segment from the Creation Bytecode

The creation bytecode always ends with the EVM RETURN instruction (hex f3), since its final job is to send the runtime bytecode to the blockchain. Here's how to split:

  1. Strip the 0x prefix from your bytecode to get a raw hex string.
  2. Find the last occurrence of f3 in the string—everything after this is your ABI-encoded constructor parameters.

For example, if your bytecode ends with ...f300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003..., the part after f3 is your target parameter data.

Step 2: Decode the ABI-Encoded int[] Parameter

Solidity's ABI encoding for int[] follows a strict format:

  1. First, a 32-byte offset (for dynamic types like arrays, this will always be 0x20, meaning the array data starts 32 bytes into the parameter segment)
  2. Next, a 32-byte uint256 representing the array length
  3. Finally, 32-byte entries for each int256 element (negative numbers are stored as two's complement)

Option A: Use Remix (Quick & Easy)

Head to Remix's console and run this snippet, replacing the hex value with your parameter segment (without the leading 0x):

bytes memory params = hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003";
(int[] memory foodOptions) = abi.decode(params, (int[]));

Run it, and you'll get the full foodOptions array.

Option B: Manual Decoding (For Understanding)

Let's use a sample parameter segment to walk through:

  • Offset: 0000000000000000000000000000000000000000000000000000000000000020 → tells us the array data starts at byte 32
  • Length: 0000000000000000000000000000000000000000000000000000000000000003 → 3 elements in the array
  • Element 1: 0000000000000000000000000000000000000000000000000000000000000001 → int value = 1
  • Element 2: 0000000000000000000000000000000000000000000000000000000000000002 → int value = 2
  • Element 3: 0000000000000000000000000000000000000000000000000000000000000003 → int value = 3

For negative numbers, like -1, you'll see a full 32-byte string of fs (ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)—that's two's complement for -1.

Option C: Use Ethers.js (If You Prefer Code)

If you have your contract's ABI, you can decode it programmatically:

const ethers = require("ethers");
const contractABI = [...]; // Paste your contract's ABI here
const iface = new ethers.utils.Interface(contractABI);
// Replace the parameter string with your extracted segment (add 0x prefix)
const decodedParams = iface.decodeFunctionData("constructor", "0xYOUR_PARAMETER_HEX");
console.log(decodedParams.foodOptions);

Step 3: Verify Your Result

To make sure you got it right, take the decoded array, plug it into your contract's constructor, generate new creation bytecode, and compare the parameter segment to the original—they should match exactly.


内容的提问来源于stack exchange,提问作者S.codez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:38:52