klaytn ide를 통해발행한 컨트랙을 caver-java를 통해 keyring 생성하여 컨트랙 실행을 테스트해보고 있습니다.
(바오밥 네트워크)
SingleKeyring deployerKeyring = caver.wallet.keyring.create(
deployerAddress,
deployerPrivateKey
);
caver.wallet.add(deployerKeyring);
위와 같이 wallet에 계정 정보 추가 한 이후에
List callResult1 = contract.call(“get”);
과 같이 컨트랙 호출하였는데요 (get 은 컨트랙 발행자만 조회 가능한 메소드)
keyring 정보가 동일한 어카운트임에도 불구하고 응답으로 메소드 revert가 발생하고 있습니다.
혹시 테스트 과정이 잘못된 부분이 있을까요?
@tjdcks1781
우선 Call에 대해서 이해하실 필요가 있을 거 같습니다.
블록체인에서 상태 변경 없이 메시지 콜을 실행하는 행위로 주로 “데이터를 읽어들일 때” 많이 사용이 됩니다.
위 내용을 이해하셨다면, 원하시는 동작에서 Keyring은 전혀 필요없다는 걸 아실 수 있습니다.
개인키가 필요한 경우는 "블록체인에 상태를 변경하는 메시지에 서명"하는 경우니까요.
API Spec을 보시면 callObject
에 어떻게 Call을 할 건지 조건을 기술해주는 부분이 있습니다. 질문자 분께서는 Owner만 호출 가능한 함수를 호출하시는 경우이기 때문에 from
필드에 Owner의 주소를 입력해주시면 됩니다.
결론적으로 caver-java를 사용하신다면 아래와 같이 코드를 사용하시면 될 거 같습니다.
Contract contract = caver.contract.create(<contractAbi>, <contractAddress>);
String ownerAddress = "0x{ownerAddress}";
CallObject callObject = CallObject.createCallObject(ownerAddress);
List callResult = contract.call(callObject, "get");
System.out.println(callResult);
1개의 좋아요
안녕하세요!
답변내용중에 궁금한 부분이 있어 추가적으로 질문드립니다!
from 필드는 컨트랙 입장에서 보면 msg.sender라고 이해하고 있는데요,
from 필드에 keyring에 생성된 어카운트의 address가 자동으로 들어가는것이 아닌가요?
만약 그렇다면 아무리 블록체인 상태변경이 필요없는 값에대한 조회만 한다하더라도, 권한에 따른 표기사항이 다른 메소드에 대해서 보안수단이 없는것아닌가요?
@tjdcks1781
블록체인은 모두에게 공개된 투명한 데이터베이스입니다.
데이터 READ 의 경우 누구나 할 수 있습니다.
설령 Solidity 에서 private 으로 변수를 선언했을 지언정 그 데이터 또한 읽을 수 있습니다.
데이터 READ를 막을 수 있는 보안 수단은 별도로 없습니다.
또한 말씀해주신 keyring 의 경우 트랜잭션 서명에 사용되는 자료구조입니다.
트랜잭션이란 블록체인에서 상태를 변경하는 행위를 뜻하고, 질문자 분의 경우 트랜잭션이 아닌 콜(Call) 을 사용하고 계시므로 관련이 없습니다. 서명을 할 필요도 없고요.
콜은 CallObject를 별도로 기술해주셔야 합니다.
참고 부탁드립니다.