[질문]
안녕하세요.
아래와 같이 컨트랙트를 실행시키려고 하고 있습니다. prepare단계에는 별 문제가 없는데, 실제로 실행을 하려고 하니 "요청을 실행할 수 없습니다."와 같은 메시지가 뜨며 실패하고 있습니다.
curl -X POST "https://a2a-api.klipwallet.com/v2/a2a/prepare" \
-d '{"bapp": { "name" : "My BApp" }, "type": "execute_contract", "transaction": { "to": "0x6366a7dd23edcdb1c9150a020f44ed29a4f94d47", "value": "0", "abi": "{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addStakingLock\",\"outputs\": [],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}", "params": "[\"1000000000000000000\"]" } }' \
-H "Content-Type: application/json"
이 컨트랙트의 다른 method들은 별 문제없이 실행되고 있습니다.
다음은 에러메시지입니다.
curl -X GET "https://a2a-api.klipwallet.com/v2/a2a/result?request_key=b2d18c50-0e0f-4209-9821-adef55bef668" -H "Content-Type: application/json"
{"request_key":"b2d18c50-0e0f-4209-9821-adef55bef668","error":{"code":500,"message":"internal server error"},"status":"error","expiration_time":1649922240}
무엇이 원인인지 확인부탁드립니다.
감사합니다.
[답변]
안녕하세요 :)
혹시 해당 method 호출 시 revert 걸릴만한 요소가 있는지 확인해주시면 좋을 것 같습니다. 로그상으로 추정하건데 실패할 tx로 판단하여 에러 처리한 것 같습니다. 추가로 a2a 요청 실행 계정에 tx fee를 부담할 충분한 잔고가 있는지도 확인해보시면 좋을 것 같습니다.
---------------
[질문]
안녕하세요.
다른 method들은 실행에 문제가 없었으므로 tx fee의 문제는 아닐거 같습니다.
현재 스마트 컨트랙트 자체에 revert걸릴 만한 요소는 보이지 않습니다.
그리고 블록체인에서 실행해서 revert가 걸리게 된다면 블록체인에서 에러 메시지를 확인 할 수 있고,
어떤게 문제가 되는지 알 수 있는데, 블록체인 실행 단계 전에 internal server error가 나는 것이므로
디버깅을 할 수 없습니다.
실패할 tx로 판단하는 것은 estimateGas로 확인하고 있는것인지도 궁금합니다.
500 에러는 블록체인이 아닌 서버쪽 에러인데, 블록체인 실행 실패에 따른 에러는
fail callback을 호출하는 방식이여야 하는게 아닐까 합니다.
아래는 컨트랙트의 소스코드입니다.
https://scope.klaytn.com/account/0x6366a7dd23edcdb1c9150a020f44ed29a4f94d47?tabId=contractCode
Compiler 버전이 Solidity v0.8.12+commit.f00d7308 인데 이 부분이 에러의 원인이 되는지 궁금합니다.
확인 부탁드립니다.
감사합니다.
[답변]
실패할 tx는 말씀해주신대로 estimateGas로 판단하고 있습니다. method별로 소모되는 fee가 다르기 때문에 잔고에 따라서 호출되지 않을 수 있긴합니다. 확인을 위해서 아래 두 가지 정도를 확인해주시면 어떨까합니다.
- 말씀하신 메소드에서 소모되는 gas fee와 호출한 계정의 KLAY 잔고
- klip 말고 kaikas나 remix 등을 사용해서 다른 계정으로 해당 메소드가 실행되는지 여부
---------------
[질문]
remix에서 테스트 계정으로 해당 메소드를 실행한 결과를 보내드립니다.
사용된 가스는 93,005입니다.
KLAY잔고는 1KLAY인데 수수료로 0.06975375KLAY가 사용되었습니다.
EstimateGas의 경우는 이더리움의 경우에도 가끔씩 오동작을 일으키곤 합니다. 그래서 사용하는 가스비를 지정해서 실행시키는 경우가 많습니다. KLIP에서 그런 기능을 넣는 것은 가능할까요? 그리고 에러 메시지가 internal server error면 문제가 뭔지 짐작할수가 없는데, 이 부분은 어떻게 진행되고 있는지 궁금합니다.
확인 부탁드립니다.
감사합니다.
[답변]
execution contract를 실행하는 클립 계정에 addStakingLock을 실행할 수 있는 적절한 권한이 있을까요? 항상 실패하는 거라면 revert나 잔고 부족을 의심하는게 적절해 보이긴합니다. 아래 댓글 참고해서 estimate gas 성공 여부를 확인해주시면 분석에 도움이 될 것 같습니다. internal server error로 표기되는 문제는 추후 버전에서 패치될 예정입니다.
https://klipforum.zendesk.com/hc/ko/community/posts/4677915371919/comments/4681823792143
---------------
[질문]
estimateGas코드입니다.
const contractAddress="0x6366a7dD23Edcdb1c9150A020f44eD29a4F94D47";
const provider=new ethers.providers.StaticJsonRpcProvider("https://public-node-api.klaytnapi.com/v1/cypress", {
chainId:8217,
name:"cypress",
});
const signerAddress="0x21b8539fcb45f837a71494902ac2a5c927957e6f";
const contract=new Contract(contractAddress, abi, provider);
const estimation=await contract.estimateGas.addStakingLock("31000000000000000000", { from:signerAddress });
console.log(parseInt(estimation.toString(), 16));
estimateGas 결과는 다음과 같습니다.
602117
현재 동작을 잘하고 있습니다. 컨트랙트의 문제는 아니였고, 일시적으로 estimateGas의 값을 가져올때 문제가 생겼던게 아닌가 하고 있습니다.
internal server 에러를 리턴하면 안 될 것 같은데, 이 부분은 따로 확인 후 다시 답변드리겠습니다.