KlayCredentials을 이용해서 privateKey를 String으로 가져오고 싶습니다

안녕하세요. web3j-ext를 이용해서 FeeDelegatedSmartContractExcution을 테스트하고 있습니다.

기존에는 Caver-java를 이용해서 성공해봤는데 web3j-ext로 바꿔서 호출해보려고 합니다
Function을 encoded하고 FeeDelegatedSmartContractExcution객체를 만들고 sender와 feepayer로 서명을 하려고 하는데 privateKey를 어떻게 가져와야하는지 모르겠습니다

// 보내는 지갑 Credentials
KlayCredentials credentials = KlayCredentials.create(testPrivateKey);

// 수수료 지갑 Credentials
String feePayerPrivateKey = keyStoreTools.getFeePayerPrivate();
KlayCredentials feePayerCredentials = KlayCredentials.create(feePayerPrivateKey);

FeeDelegatedSmartContractExecution fdsc = new FeeDelegatedSmartContractExecution.Builder()
                .setFrom(credentials.getAddress())
                .setTo(nftAddress)
                .setValue(BigInteger.ZERO)
                .setGas(BigInteger.valueOf(3000000))
                .setGasPrice(BigInteger.valueOf(25000000000L))  // 25 Gwei
                .setInput(encodedFunction).build();

        fdsc.sign(credentials);
        fdsc.signAsFeePayer(feePayerCredentials);

함수는 이렇게 구현하였습니다.

정확하게 확인하려고

KlayCredentials credentials = KlayCredentials.create(testPrivateKey);
        log.info("======== credentials : {}", objectToString(credentials.getEcKeyPair().getPrivateKey().toString(16)));

로 확인했는데 privateKey가 "0x0ABCD~~"인데 "ABCD~~"로 로그가 남아서 문의드립니다.

안녕하세요.

우선 Function을 encoded하고 FeeDelegatedSmartContractExcution객체를 만들어 sign 하고자 하신다면

예제를 참조하시면 좋을 것 같습니다.

추가적으로 privateKey를 String으로 가져오는 것은,

ECKeyPair keyPair = credentials.getEcKeyPair();
BigInteger privateKeyBigInt = keyPair.getPrivateKey();
String privateKeyHex = Numeric.toHexStringNoPrefixZeroPadded(privateKeyBigInt, 64);

의 로직을 참조하시면 되겠습니다.

참고로 KlayCredential의 구조는 Klaytn의 account 종류를 지원하기 위해서,

기존의 web3j의 Credentials 구조체의 주소-keyPair 쌍의 커플링만 분리해놓은 형태이기 때문에

keyPair 관련된 로직은 기존 web3에서 사용했던 것과 동일하게 사용하셔도 됩니다.