Ethers 라이브러리로 ERC721 배포 시 에러 발생 질문입니다

안녕하세요.

우선 저희는 기존에 작업해놓은 ethers 라이브러리 기반 ERC721 deploy API가 있습니다.

그 API를 이용해서 클레이튼 테스트넷에 ERC721 배포를 시도했는데 에러가 발생합니다.

같은 코드와 컨트랙트 소스로 Ethereum쪽에서는 정상작동하였고, Remix IDE로 클레이튼 테스트넷에 시도했을 때에도 정상 배포되었습니다.

node.js에서 ethers 사용 시 클레이튼에 배포할 때에만 deploy 관련 parameter 설정 도중 gasLimit값 진행 시 문제가 되는 것 같습니다.

아마 ethers 내부 문제일테고 Klaytn은 caver-js 사용이 권장되는 것은 알고 있지만 혹시 해결 방법이나 정보관련 답변이 가능하시다면 부탁드립니다.

■ ethers 사용 contract deploy 코드 예시

const signer = new ethers.Wallet(private_key).connect(provider);
const contract_factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await contract_factory.deploy(...deploy_parameters);

// deploy contract and return result
const deploy_result = await contract.deployTransaction.wait();

■ Error 로그
Error: invalid BigNumber value (argument=“value”, value=undefined, code=INVALID_ARGUMENT, version=bignumber/5.4.1)
at Logger.makeError (/home/user/node_modules/@ethersproject/logger/lib/index.js:187:21)
at Logger.throwError (/home/user/node_modules/@ethersproject/logger/lib/index.js:196:20)
at Logger.throwArgumentError (/home/user/node_modules/@ethersproject/logger/lib/index.js:199:21)
at Function.BigNumber.from (/home/user/node_modules/@ethersproject/bignumber/lib/bignumber.js:241:23)
at Formatter.bigNumber (/home/user/node_modules/@ethersproject/providers/lib/formatter.js:153:38)
at Function.Formatter.check (/home/user/node_modules/@ethersproject/providers/lib/formatter.js:380:40)
at Formatter._block (/home/user/node_modules/@ethersproject/providers/lib/formatter.js:250:26)
at Formatter.block (/home/user/node_modules/@ethersproject/providers/lib/formatter.js:255:21)
at JsonRpcProvider. (/home/user/node_modules/@ethersproject/providers/lib/base-provider.js:1615:82)
at step (/home/user/node_modules/@ethersproject/providers/lib/base-provider.js:49:23) {
reason: ‘invalid BigNumber value’,
code: ‘INVALID_ARGUMENT’,
argument: ‘value’,
value: undefined,
checkKey: ‘gasLimit’,
checkValue: undefined
}

안녕하세요.
ethers generator에서 JSON-RPC call 하는 부분에서 발생한 문제로 추측 되네요.
현재 Klaytn API와 ethereum API의 parameter, return type 등이 완전히 동일한 것은 아니여서,
etheres를 포함한 ethereum SDK와 호환되지 않는 부분이 있습니다.
Klaytn 개발팀에서도 이 부분을 인지하고 있으며,
사용자들의 편의를 위해 호환성을 맞추려고 지속적으로 노력하고 있습니다.
당장 해결 방법을 말씀 드리지 못해서 아쉽네요.
조금 더 확인해보고 공유 드릴 부분이 있으면 추가로 답변 남기겠습니다.


tx deploy 후에 확인차 getBlock 해오고,
받은 응답을 blockWithTransaction으로 formatting 할 때 에러가 발생하는 것으로 보이네요.

이해를 돕기위해 설명을 덧붙이면, Klaytn과 ethereum은 Block에 들어간 field에 차이가 있습니다.
Klaytn은 miner(POW가 아니기에), gasLimit 필드가 존재하지 않구요.
자체 기능에 따라 governanceData, voteData 등의 필드를 추가로 가집니다.

이에 Klaytn에서 조회한 block을 ethereum의 block으로 formmating 하려고 하면
몇 가지 필드가 존재하지 않아서 에러가 발생합니다.

사용자께서 당장 해결할 수 있는 문제는 아니여서, caver 사용을 권장드립니다.

1 Like

답변 내용 덕분에 관련 내용이 이해가 잘 가네요.

어설프게 ethers 라이브러리를 커스텀 하지않고 caver-js로 작업하는게 나을 것 같네요.

좋은 답변 감사합니다!

1 Like

이 문제는 아래와 같은 코드로 해결이 가능합니다.

const randomAddress = “0xABCD…”;
const originalBlockFormatter = provider.formatter._block;
provider.formatter._block = (value, format) => {
return originalBlockFormatter(
{
gasLimit: ethers.constants.Zero,
miner: randomAddress,
nonce: randomAddress,
…value,
},
format,
);
};

2 Likes

1.8 이후로는 이 코드가 없이도 잘 동작합니다.

2 Likes

답변해주신 내용대로 호환이 되는지 한번 테스트 해보겠습니다.
답변 감사합니다!