안녕하세요
한글 값을 스마트 컨트랙트에 올리고 있는데 encodeABI를 사용 할시에 method 와 parameters 값들이 encoding 되면서 scope에서 한글이 깨져 나옵니다. 이 이슈는 클레이튼 팀과 scope팀과 여러번 커뮤니케이션 후에 확인 했습니다.
그래서 encodeABI를 사용하지 않고 데이터를 올릴려고 하는데 어떻게 해야 하는지 알수 있을까요?
예를 들어 아래와 같은 코드가 있다는 가정하에 encodeABI를 사용하지 않고 데이터를 올릴수 있는 방법이 있을까요?
String encodeData = contract.getMethod(“insertPack”).encodeABI(Arrays.asList(
bundlePack.getBundleId().intValue(),
bundlePack.getPackId().intValue(),
bundlePack.getSortDate(),
Optional.ofNullable(bundlePack.getUserCode()).orElse(""),
rank,
Optional.ofNullable(bundlePack.getUnitSize()).orElse(""),
bundlePack.getWeight().intValue(),
Optional.ofNullable(bundlePack.getGoodsType()).orElse(""),
Optional.ofNullable(bundlePack.getSortNumber()).orElse(""),
Optional.ofNullable(bundlePack.getOrigin()).orElse("")
));
FeeDelegatedSmartContractExecution feeDelegatedSmartConstract = new FeeDelegatedSmartContractExecution.Builder()
.setKlaytnCall(caver.rpc.klay)
.setFrom(sender.getAddress())
.setTo(transactionSmartContractAddress)
.setInput(encodeData)
.setGas(BigInteger.valueOf(500000))
.setFeePayer(feePayer.getAddress())
.build();
안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.
Scope에서 데이터가 보이기 위해서는 transaction의 input에 들어있는 데이터가 모두 UTF-8로 변환 가능한 데이터여야 할 것 같습니다. “encodeData” 변수에 들어가는 것은 맨 앞의 4바이트가 smart contract 내 method에 대한 signature이기 때문에, 이 값이 UTF-8로 변환 가능하다라고 이야기할 수 없으니, 이 소스코드로는 scope에 보여주는 것이 가능할지 잘 모르겠습니다.
scope상에서 데이터를 보여주고 싶으시다면 아래 두 가지 방법이 있을 것 같습니다.
- 위 트랜잭션과는 별도로 0 KLAY를 전송하는 valueTransferMemo 트랜잭션을 발생시킨다. 참고
- 스마트 컨트랙트 함수가 실행될 때, emit event를 발생시킨다. 요 방법은 scope에서 현재는 표현되지 않을 것 같습니다만, transaction의 input data 중간에 들어있는 의미있는 UTF-8 string을 decoding하는 것보다는 현실적일 것 같습니다. 좀 더 설명드리자면 event PrintMessage(string) 과 같이 특정 event를 정의하고 그 이벤트로 들어올 경우에 대해서 scope에서 추가로 분석하여 보여드리는 방식은 가능하지 않을까 싶습니다. 현재도 KIP-7에 대한 event 로그는 별도로 분석하여 보여주고 있습니다. 참고
@colin.kim 답변 감사드립니다.
event logs에 넣는것도 좋은 방법이긴 하나 유저가 보기에는 log는 실제 데이터가 저장 되는게 아니기 때문에 사용하기에는 어려움이 있을거 같습니다. 궁금한점은 FeeDelegatedSmartContractExecution setInput에서 꼭 encodeABI를 사용한 value만 사용해야 하나요? 단순하게 encode를 안하고 한글 value들만 UTF-8으로 변환후에 데이터를 올리고 싶습니다. 기억은 잘 안나지만 예전 caver 버전에서는 encode를 사용 하지 않고 데이터를 올릴수 있었던거 같은데 지금은 API가 너무 바뀌어서 뭘 사용해야 할지 잘 모르겠습니다. scope 팀에 문의 해본 결과는 endoeABI를 쓰면 method name과 UTF-8된 value들이 encoding되면서 scope에서 decoding할때 UTF-8가 어디 value에 사용되었는지 찾기가 힘들어서 현재 한글 value들은 깨져서 나온다고 전달 받았습니다.
안녕하세요, fee delegation smart contract execution은 기본적으로 컨트랙트를 실행하기 위한 트랜잭션입니다. 때문에 input의 맨 처음 4 byte가 function signature여야 하는 것이고요. 원하시는 게 어떤 건지 잘 이해가 가지 않습니다.
- 스마트 컨트랙트 실행은 모르겠고, scope에 데이터가 보였으면 좋겠다.
-> 이 의견이시라면 저 위에 답변드린 valueTransferMemo에 KLAY를 0으로 보내는 트랜잭션을 만드시면 될 것 같습니다.
- 스마트 컨트랙트도 정상 실행되어야 하고, scope에도 데이터가 보였으면 좋겠다.
-> 이 의견이시라면 쉬운 방법은 없는 것 같습니다. 바로 위 단락에서 말씀드린 것처럼 스마트 컨트랙트가 정상 실행되기 위해서는 첫 4 byte가 function signature여야 하는데, 이 값이 UTF-8로 정상 decoding될 수 있다고 보장할 수 없기 때문입니다.