728x90
트랜잭션을 보낼때 논스값이 같은 경우가 생겨서 이를 해결하려고 한다.
기존 코드
EthGetTransactionCount ethGetTransactionCount = web3jHttpRpc.ethGetTransactionCount(
PUBLIC_KEY,
DefaultBlockParameterName.PENDING
).send();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
블록체인과 통신하는 과정이 비동기 처리로 되다보니 논스값을 받아 트랜잭션을 보내는 부분을 for문으로 처리했다가 nonce값이 같은 트랜잭션을 보내는 경우가 생겼다.
동시성 해결 코드
(1) nonce를 받아오는 부분만 동기처리
private static BigInteger currentNonce = null;
synchronized (KlaytnServiceImpl.class) {
if (currentNonce == null) {
EthGetTransactionCount ethGetTransactionCount = web3jHttpRpc.ethGetTransactionCount(
PUBLIC_KEY,
DefaultBlockParameterName.PENDING
).send();
if (ethGetTransactionCount.hasError()) {
throw new IOException("nonce 실패");
}
currentNonce = ethGetTransactionCount.getTransactionCount();
}
}
BigInteger nonce = currentNonce;
System.out.println(nonce + "nonce 값");
트랜잭션을 보내는건 동기처리가 되어있지 않기 때문에 결국 논스값의 중복이 생김
(2) 메소드 동기처리
synchronized public void
논스를 받아와 트랜잭션을 보내는 메소드를 동기처리 해버렸다.
(3) 수동으로 논스값 올리기
위 2개는 계속 논스값을 블록체인에서 받아오고 동기로 처리하는 부분때문에 효율성이 떨어진다고 생각했다.
그래서 첫 논스값만 받아온 후 다음 논스값부터는 수동으로 올려서 for문을 처리하는걸로 했다.
BigInteger nonce = getNonce();
for(MultiChooseWinnerDto tx : dto) {
...트랜잭션 보내는 로직...
nonce = nonce.add(BigInteger.ONE);
}
728x90
'개발 > BlockChain' 카테고리의 다른 글
[Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot) (0) | 2023.08.15 |
---|---|
[Blockchain] 언어별 web3 차이로 트랜잭션 해시값 차이 (0) | 2023.08.08 |
[BlockChain] EIP 55란? (0) | 2023.07.18 |
[BlockChain] 코인과 토큰의 차이 (0) | 2023.02.06 |
[BlockChain] 블록체인의 트릴레마 (0) | 2023.02.05 |