Returned error: not a program account (e.g., an account having code and storage) 에러를 재현해보고 싶고 해당 에러 원인을 알고 싶습니다

안녕하세요.

제목에서 언급한대로 Returned error: not a program account (e.g., an account having code and storage) 에러를 재현해보고 싶고 해당 에러 원인을 알고 싶습니다.

  • 현재 baobab EN v1.5.3 을 state.tries-in-memory=4 옵션을 주고 띄웠습니다.
  • CloneFactoryCreate2 를 상속한 factory contract를 하나 배포하였고 해당 컨트랙트를 통해 contract account 를 생성합니다.

어떻게 재현해야할지 정확하게 몰라 아래와 같은 시나리오로 스크립트를 작성하여 돌려보다가 도움을 구하게 되었습니다.

테스트 시나리오

  1. factory contract를 통해 새로운 contract account를 생성합니다. 그리고 해당 account의 주소(이하 addr1)와 블럭넘버 (이하 bn1)을 얻습니다.
  2. addr1 로 klay를 전송합니다. 전송하는 방식은 legacyTransaction을 만들어 sendRawTransaction을 통해 전송합니다. 여기서 블럭 넘버(이하 bn2)를 얻습니다.
  3. 그리고 klay_blockNumber를 통해 최신 블럭넘버를 얻습니다. (이하 bn3)
  4. bn1, bn2, bn3addr1을 이용하여 baobab EN에 klay_getBalance 를 통해 잔액을 조회합니다.
  5. 2초간 쉬고 2-4번 과정을 n번 반복합니다.

결과

위와 같은 방식으로 테스트를 돌렸을 때

{
  "jsonrpc":"2.0",
  "id":"1",
  "error": {
    "code":-32000,
    "message":"missing trie node ...(생략) "
  }
}

와 같은 에러밖에 얻지 못했습니다.

질문

  • not a program account 에러를 재현하려면 어떻게 하면 좋을까요?
  • 제가 아직 not a program account 에러가 발생하는 구체적인 원인을 알지 못해서 헤매고 있는 것 같습니다. 혹시 not a program account이 에러가 발생하는 원인에 대해서 알려주실 수 있을까요? 주로 이 에러가 블럭 싱크가 밀릴 때 자주 발생했던 것 같습니다.

안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.

해당 에러는 contract가 아닌 account에 klay_call() 등의 컨트랙트를 호출하는 함수를 사용했을 경우에 발생하는 에러입니다. 즉, contract가 아닌 일반 사용자 계정(EOA)에 klay_call()함수를 호출하시면 해당 에러를 확인하실 수 있습니다.

klay_getBalance()함수를 호출했을 때 not a program account 에러가 발생하지는 않을 것 같습니다.

확인해보시고, 추가 질문이 있으시다면 댓글 부탁드리겠습니다.

감사합니다.