Transaction 다량 발생 중 invalid null 에러 발생 질문

pragma solidity 0.5.6;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyERC20 is ERC20() {
    constructor() ERC20() public {

    }
}

위와 같은 erc20 컨트랙트를 저희가 구축한 kscn node위에서 5000건 발생시키는 테스트 중에 아래와 같은 에러가 발생하였습니다.

(node:5818) UnhandledPromiseRejectionWarning: Error: Invalid response: null
    at Object.InvalidResponse (/Users/Documents/erc20/node_modules/caver-js/packages/caver-core-helpers/src/errors.js:90:37)
    at XMLHttpRequest.request.onreadystatechange (/Users/Documents/erc20/node_modules/caver-js/packages/caver-core-requestmanager/caver-providers-http/src/index.js:103:32)
    at XMLHttpRequestEventTarget.dispatchEvent (/Users/Documents/erc20/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22)
    at XMLHttpRequest._setReadyState (/Users/Documents/erc20/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14)
    at XMLHttpRequest._onHttpRequestError (/Users/Documents/erc20/node_modules/xhr2-cookies/dist/xml-http-request.js:349:14)
    at ClientRequest.<anonymous> (/Users/Documents/erc20/node_modules/xhr2-cookies/dist/xml-http-request.js:252:61)
    at ClientRequest.emit (events.js:315:20)
    at Socket.socketErrorListener (_http_client.js:469:9)
    at Socket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:106:8)

위와 같은 에러가 한번 발생한 이후에 발행되는 transaction에서는 같은 에러가 다량 발생합니다.
노드에서 txpool을 확인해보니 queue상태에서 pending상태로 넘어가지 못하고 tx들이 쌓여있는 것을 확인했습니다.

혹시 위와 같은 문제가 발생하는 원인을 알고있으신지 질문드립니다.

안녕하세요
혹시 펜딩된 트랜잭션들의 nonce를 확인해 보셨나요?
다량으로 동시에 발생시키는 경우 자동 nonce 할당이 꼬일 수도 있습니다.

만약 nonce를 따로 관리해서 정상적으로 할당하였음에도 에러가 지속된다면 에러를 재현할 수 있는 코드 제공해 주시면 보도록 하겠습니다.

네, 아래와 같은 코드로 동작시켰고 루프 횟수만 바꿔서 테스트 하였습니다.

let findKeystore = async function(addr) {
    let dir = `${process.env.KEYSTOREPATH}`;
    let filelist = fs.readdirSync(dir);
    let keyaddr = addr.split('0x')[1];
    for(let idx = 0; idx < filelist.length; idx++) {
        if(filelist[idx].split(keyaddr).length > 1) {
            return JSON.parse(fs.readFileSync(dir+'/'+filelist[idx], 'utf-8'));
        }
    }
    return null;
}

let sendSmartContractDeploy = async function(keyring, rawTx, cbHash, cbReceipt, finality) {
    try {
        if(caver == null || caver == undefined) {
            throw new Error("invalid provider!");
        }
        const tx = caver.transaction.smartContractDeploy.create(rawTx);
        await tx.sign(keyring); 
        if(finality == false) { 
            caver.rpc.klay.sendRawTransaction(tx)
            .on('transactionHash', async function(txHash) {
                if(cbHash != null) {
                    await cbHash(txHash);
                }
            })
            .on('receipt', async function(receipt) {
                if(cbReceipt != null) {
                    await cbReceipt(receipt);
                }
            });
        } else { 
            await caver.rpc.klay.sendRawTransaction(tx)
            .on('transactionHash', async function(txHash) {
                if(cbHash != null) {
                    await cbHash(txHash);
                }
            })
            .on('receipt', async function(receipt) {
                if(cbReceipt != null) {
                    await cbReceipt(receipt);
                }
            });
        }
    } catch(error) {
        console.log(error);
    }
}

let deploy = async function(keyring, nonce, cbHash, cbReceipt, finality) {
    try {
        let instance = await createContract(abi);
        let data = await instance.deploy({data: byteCode}).encodeABI();
        let cmder = keyring._address;
        let gas = 2000000;
        const rawtx = {
            from: cmder,
            nonce: toHex(nonce),
            gas: gas,
            data: data};
        return deployContract(keyring, rawtx, cbHash, cbReceipt, finality);
    } catch(error) {
        console.log(error);
        return null;
    }
}

let deployERC = async function() {
    try {
        let cmder = process.argv[2];
        let passwd = process.argv[3];
        
        let keystore = await findKeystore(cmder);
        if (keystore == null) {
            throw new Error("Keystore File does not exist!");
        }
        let keyring = await caver.wallet.keyring.decrypt(keystore, passwd);
        if (keyring == null) {
            throw new Error("get keyring failed!");
        }

        let nonce = await caver.rpc.klay.getTransactionCount(keyring._address);
        if (nonce == null) {
            throw new Error("get nonce failed!");
        }

        let cbHash = async function(txHash) {
            console.log(`Deploy TX:['${colors.green(txHash)}'] Created!`);
        }
       
        let cbReceipt = async function(receipt) {
            console.log(`TX:['${colors.green(receipt.transactionHash)}'], Nonce:[${colors.green(toNum(receipt.nonce))}], BlockNumber:[${colors.green(parseInt(receipt.blockNumber))}]`);
        }

        for(let idx = 0; idx < 100000; idx++){
            await deploy(keyring, nonce++, cbHash, cbReceipt, false).catch(
                function (error) {
                    console.log(error.message);
                }
            );
        }
        return true;
   	} catch(error) {
        console.log(error);
        return false;
    }
}

논스는 정상적으로 들어갔는지 확인하셨을까요?

네, txpool.content로 체크했을 때 nonce값 정상적으로 들어갔고 caver로 sendTransaction한 뒤에 nonce 증가시킨후 다음 tx 를 만들어서 send하고있습니다

음 그러면 지금 현상이 트랜잭션들에 논스가 차례대로 중간에 빈 값 없이 정상적으로 할당되어 들어갔는데 트랜잭션 처리가 안되고 있는게 맞으실까요?

아니면 논스가 중간에 빈 값이 있거나 해서 꼬여서 트랜잭션 처리가 안되는 것일까요?

현상이 전자나 후자냐에 따라서 어디서 에러가 발생하는지 봐야하는게 달라질 수 있기 때문에 질문드립니다.

안녕하세요?
논스가 차례로 중간에 빈 값 없이 정상적으로 할당되어 들어갔음에도 트랜젝션 처리가 안되고 있는 상황입니다.
제가 새로운 토픽으로 포럼에 글을 올렸는데, 하기 링크를 검토해주시면 감사하겠읍니다.