Klaytn IDE 사용 / Transaction Debugging 관련 문의

안녕하세요,

아래 트랜잭션이 ‘Fail : ErrExecutionReverted - uint(0x09)’ 로 실패합니다.

상황이 도저히 이해가 안되어서 디버깅을 해보려고 했습니다

스마트 컨트랙트 내부 로직에 의해서, revert 된 것으로 예상하고 있습니다.
자세한 이유를 알기 위해서, Klaytn IDE 를 켜고, Debugger 기능을 이용 해보려 했습니다
Klaytn IDE에서 'Run → Environment → Caver Provider’에, 제가 구동 중인 Klaytn Endnode 주소와 포트를 입력하였습니다.

그리고 확인을 누르면 아래와 같은 에러 메시지가 Endnode의 로그에 남습니다.
다음 과정에 대해서 조언을 구할 수 있을까요?

2021/03/28 18:05:44 0.000 #0000000500000001 - XXXXXXXXXXX:8551<->XXXXXXXXXXX:64398 - I/mѸGa<XYa> http:///%7B%15%EBi~e3%F6ezb!%B76%5D%FB%1B%DE
G%A1%91%60%83%D2#GKP - cannot parse requestURI "{\x15\xebi~e3\xf6ezb!\xb76]\xfb\x1b\xdeG\xa1\x91`\x83\xd2#\x9fG\xdf\xedK\x9fP\x00": parse "{\x15\
xebi~e3\xf6ezb!\xb76]\xfb\x1b\xdeG\xa1\x91`\x83\xd2#\x9fG\xdf\xedK\x9fP\x00": net/url: invalid control character in URL                          
INFO[03/28,18:05:45 +09] [5] Inserted a new block                      number=55223031 hash=f343c7…352dac txs=5   gas=354244  elapsed=28.654ms  p
rocessTxs=24.151ms  finalize=1.050ms   validateState=40.903µs  totalWrite=1.455451ms  trieWrite=1.162507ms                    
               
2021/03/28 18:05:46 error when serving connection "XXXXXXXXXXX:8551"<->"XXXXXXXXXX:64400": error when reading request headers: cannot find h
ttp request method in "\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\xd6\xfeTө\xec;\xf7\xe4}ڳ\xe8\x86KP\x9f_ٴ\n\x8e\xa4\x9a\xdf5\xf3\x9dCy^\x0e 4\
x9d\x9ab=m\xa8U:u\xd6LE\xe2`\x04\x9f\xd6.u\xfe\u07b2\xf5+1\xf9\xff\xb5\xc0,\xe7\x00 \x8a\x8a\x13\x01\x13\x02\x13\x03\xc0+\xc0/\xc0,\xc00̨̩\xc0\x13\
xc0\x14\x00\x9c\x00\x9d\x00/\x005\x01\x00\x01\x93\x1a\x1a\x00\x00\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\n\x00\n\x00\bzz\x00\x1d\x00\x17\x00\x18
\x00\v\x00\x02\x01\x00\x00#\x00\x00\x00\x10\x00\x0e\x00\f\x02h2\bhttp/1.1\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\r\x00\x12\x00\x10\x04\x03\b\x04
\x04\x01\x05\x03\b\x05\x05\x01\b\x06\x06\x01\x00\x12\x00\x00\x003\x00+\x00)zz\x00\x01\x00\x00\x1d\x00 6bʂ\x17hH\x9c\xbcQ\x14%\n\x92\x17\a\xc8\xd5
\xf8\x8a\x91\x13^r\x0f\x80\xe6w\x9f+[\x1b\x00-\x00\x02\x01\x01\x00+\x00\v\nZZ\x03\x04\x03\x03\x03\x02\x03\x01\x00\x1b\x00\x03\x02\x00\x02\x9a\x9a
\x00\x01\x00\x00\x15\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00". Buffer size=517, contents: "\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03
\x03\xd6\xfeTө\xec;\xf7\xe4}ڳ\xe8\x86KP\x9f_ٴ\n\x8e\xa4\x9a\xdf5\xf3\x9dCy^\x0e 4\x9d\x9ab=m\xa8U:u\xd6LE\xe2`\x04\x9f\xd6.u\xfe\u07b2\xf5+1\xf9\
xff\xb5\xc0,\xe7\x00 \x8a\x8a\x13\x01\x13\x02\x13\x03\xc0+\xc0/\xc0,\xc00̨̩\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00/\x005\x01\x00\x01\x93\x1a\x1a\x00\x
00\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\n\x00\n\x00\bzz\x00\x1d\x00\x17\x00\x18\x00\v\x00\x02\x01\x00\x00#\x00\x00\x00\x10\x00\x0e\x00\f\x02h2
\bhttp/1.1\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\r\x00\x12\x00\x10\x04\x03\b\x04\x04\x01\x05\x03\b\x05\x05\x01\b\x06\x06\x01"..."\x00\x00\x00\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

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

아쉽게도 현재 Klaytn IDE에서 endpoint와 연결하는 부분은 public EN이 종료되면서 지원이 되지 않고 있습니다. 참고 부탁드립니다.

추후에 해당 기능을 사용할 수 있도록 IDE를 개선하도록 하겠습니다.

감사합니다.

답변 감사드립니다.
그럼 다른 developer 분들은 위와 같은 상황에서 어떻게 디버깅을 하는지 간단히 알 수 있을까요?
이 쪽으로 문외한이라서, 무엇을 쓰면 되는지 감이 안옵니다…

엔드노드는 제가 하나 운영하고 있어서, 그 곳에서 연결해서 쓰면 될 것 같습니다

아 제가 질문을 잘못 이해했었군요! 죄송합니다.

별도의 endpoint를 운영하신다면 그 endpoint의 URL을

Run → Environment → Caver Provider에 넣어주시면 될 것 같습니다만, 주소를 어떻게 넣으셨나요?

http://localhost:8551 로는 잘 동작하는 것을 확인했었습니다.

또한, 별도의 노드를 운영하신다면 아래의 API를 이용하여 revert message를 확인하실 수 있습니다.

> debug.traceTransaction("txhash", {tracer: "revertTracer"})

  1. 네, 제 endpoint url을 넣어도 연결이 안되고,
    최초 질문 본문에 있던 에러 로그가 엔드노드에서 찍히는 것을 확인했습니다 ㅜㅜ

  2. 감사합니다. {tracer: “revertTracer”} 를 넣고 traceTransaction 해보니 아무것도 안나오는데 왜 일까요?

아래는 해당 트랜잭션를 클레이튼 스코프에서 조회한 것입니다.
트랜잭션 결과가 ‘Fail : ErrExecutionReverted - uint(0x09)’ 라고 되어 있습니다.

  1. 위 로그가 unicode가 파싱이 안되어서 정확한 URL을 확인할 수 없습니다. 아래 curl 명령을 통해 현재 컴퓨터에서 접근 가능한지 확인 부탁드리겠습니다.
$ curl -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"klay_blockNumber","params":[],"id":83}' <endpoint_url>
  1. 해당 에러가 ""로 나온다는 것은 컨트랙트의 revert message가 없거나, revert가 아닌 다른 이유로 컨트랙트 실행이 멈춘 경우입니다. 이 경우에는 out of gas이거나, 아니면 EVM 버전이 안맞을 수도 있습니다. 현재 이더리움은 istanbul EVM을 지원하나 클레이튼은 constantinople EVM만 지원합니다. revertTracer가 아닌 callTracer를 실행하시면 어떤 EVM opcode에서 실행이 종료되었는지도 확인하실 수 있을 것 같습니다. 제가 traceTransaction()을 해보니, REVERT opcode로 종료된 것은 맞는 것 같습니다만, 컨트랙트에서 에러 메시지를 출력하지 않도록 구현되어있는 것 같습니다. 정확한 것은 컨트랙트 구현을 봐야 할 것 같습니다.

curl -H … (IP_ADDRESS):8551
=> {“jsonrpc”:“2.0”,“id”:83,“result”:“0x34bb9de”}

curl -H … http://(IP_ADDRESS):8551
=> {“jsonrpc”:“2.0”,“id”:83,“result”:“0x34bb9de”}

curl -H … https://(IP_ADDRESS):8551
=> (응답 없음)

단 3번의 https 를 이용한 요청을 하면, endnode에 다음의 에러 로그가 남습니다.

"2021/03/29 14:06:25 error when serving connection “XXXXX:8551”<->“YYYYYY:61321”: error when reading request headers: EOF. Buffer size=517, contents: “\x16\x03\x01…”

Klaytn IDE에 http://(IP_ADDRESS):8551 로 접속해도 안되네요… 왜 이런건지 이해가 안되네요 ㅜㅜ

  1. 감사합니다! 어떻게 저떻게 해서 일단 이 문제는 처리 했네요… 스마트컨트랙트 코드를 모르니 너무 힘드네요

https의 경우 HTTPS protocol이 활성화되어야 하는데, 그 부분은 설정이 잘 되었는지 확인이 필요할 것 같습니다.

Klaytn IDE의 경우 CORS문제로 http://ide.klaytn.com, https://ide.klaytn.com 둘 모두를 지원합니다.

HTTP://(IP_ADDRESS):8551로 사용하고자 하실 경우에는 http://ide.klaytn.com 로 접속하셔야 합니다.

참고 부탁드리겠습니다.