서비스 체인내 토큰 전송 관련 문의 드립니다

서비스체인(Servicechain)을 운영하고 싶습니다. 어떻게 해야하나요?에서 토론을 계속:

안녕하세요. 해당 링크와 관련하여 문의 드립니다.

우선 초기 질문에서 2가지가 섞여서 다시 정리해서 문의 드립니다.

테스트 환경에서 1개 계정만 사용하지 않았습니다.(2000개)

#SCN을 몇대로 구성하였는지 ?
#transaction은 한대로만 전송을 한 경우인지?
=> 4대로 테스트해봄 (사진첨부)
=> 각 WAS는 2000개의 키를 가지고 트랜잭션 전송함

#Tx의 nonce의 처리는 어떻게 하였는지?
=> caver-java와 caver-java를 이용해 생성한 컨트랙트.java를 사용해서 nonce 처리는 따로하지 않음

SCN의 instance type은 무엇인지?

=> t2.2xlarge
=> CPU 사용량은 10%~14%, CPU 크레딧 또한 여유로웠음

SCNdml conf파일은 어떻게 설정했는지?

=> 아래가 설정 내용입니다.

Configuration file for the kscnd

SCSIGNER=
SCSIGNER_PASSWD_FILE= # Need to right password file for the keystore file of the scsigner address

NETWORK_ID=1000

PORT=30000 # if EN(main-bridge) and SCN(sub-bridge) on same instance, use different port with EN.(EN: 32323, SCN:22323)

SERVER_TYPE=“fasthttp”

SYNCMODE=“full”

VERBOSITY=3

txpool options setting

TXPOOL_EXEC_SLOTS_ALL=16384

TXPOOL_NONEXEC_SLOTS_ALL=16384

TXPOOL_EXEC_SLOTS_ACCOUNT=16384

TXPOOL_NONEXEC_SLOTS_ACCOUNT=16384

TXPOOL_LIFE_TIME=“5m”

rpc options setting

RPC_ENABLE=1 # if this is set, the following options will be used

RPC_API=“klay,subbridge,net,personal” # available apis: admin,debug,klay,miner,net,personal,rpc,txpool,web3,mainbridge,subbridge

RPC_PORT=7551 # if main-bridge and sub-bridge on same instance, use different port with main-bridge.(main: 8551, sub:7551)

RPC_ADDR=“0.0.0.0”

RPC_CORSDOMAIN="*"

RPC_VHOSTS="*"

ws options setting

WS_ENABLE=1 # if this is set, the following options will be used

WS_API=“klay”

WS_ADDR=“0.0.0.0”

WS_PORT=7552 # if main-bridge and sub-bridge on same instance, use different port with main-bridge.(main: 8552, sub:7552)

WS_ORIGINS="*"

service chain options setting

SC_MAIN_BRIDGE=0 # if this is set, the following options will be used.

SC_MAIN_BRIDGE_PORT=50505

SC_MAIN_BRIDGE_INDEXING=0

SC_SUB_BRIDGE=0

SC_SUB_BRIDGE_PORT=50506 # if main-bridge and sub-bridge on same instance, use different port with main-bridge.(main: 50505, sub:50506)

SC_PARENT_CHAIN_ID=8217

SC_ANCHORING=0

SC_ANCHORING_PERIOD=1

SC_TX_LIMIT=1000

Setting 1 is to enable options, otherwise disabled.

METRICS=1

PROMETHEUS=1

NO_DISCOVER=1

DB_NO_PARALLEL_WRITE=0

MULTICHANNEL=1

SUBPORT=$((PORT + 1)) # used for multi channel option

VTRECOVERY=1 # value transfer recovery

Raw options e.g) “–txpool.nolocals”

ADDITIONAL=""

DATA_DIR="/home/ec2-user/data"

LOG_DIR=$DATA_DIR/logs

추가적으로 1개의 계정에서 다수의 계정에 토큰전송을 진행하는 프로세스에서 tps를 올릴 수 있는 방안에 대한 조언도 부탁 드립니다.

감사합니다.

해당 Transaction을 Caver-java에서 생성해서 전송한다고 하셨는데 해당 부분 코드 확인이 가능할지요?

receipt을 기다리거나 하는 로직이 없이 tx만 생성하여 KSCN에 전송을 하시게 되면 보통 sendTransaction 속도보다 block에 담아 처리되는 속도가 느리기 때문에 'txpool is full` 메시지가 발생됩니다.
이때는 해당 tx를 sendTransaction하는 것이 실패하였고 그 사유가 KSCN의 txpool의 사이즈가 가득 찾기 때문입니다. 그래서 이경우는 예외처리를 하여 다시 해당 tx로 전송을 시도하여야 합니다.

해당 에러가 발생되지 않는 경우에는 충분히 빠르게 tx를 전송하지 못하는 것으로 추측됩니다.
테스트 도중에 아래 API로 txpool의 상태를 확인해보시면 좋을것 같습니다.


(해당 API로 queued에 tx가 있는 것은 nonce를 제대로 정렬하지 않았다는 것이며 이것이 계속 늘어난다는 것은 특정 nonce가 빠진 tx가 있다는 것입니다.)

1개의 계정으로 다수의 계정에 KLAY 전송을 하실때에는 해당계정의 순차적인 nonce로 tx를 일괄된 노드에 전송을 해주는 것이 좋습니다.
nonce가 정렬이 되는 tx들에 대해서 한번에 처리가 가능하기 때문에 각 nonce를 다른 노드에 전달하게되면 처리가 늦어지게됩니다.

Jmeter에서 WAS로 요청을 보내고 WAS에서 트랜잭션을 전송 WAS는 트랜잭션 처리에 대한 성공 또는 실패에 대한 응답을 Jmeter에 해주고Jmeter는 응답을 수신하면 새로운 요청을 보냄

TransactionReceipt 에서의 tx hash값은 모두 정상 수신했습니다.

[ WAS에서 Klaytn으로 트랜잭션 전송 후 Receipt 수신까지의 테스트 코드 ]

// 초기 설정

Caver caver = Caver.build(url);

KlayCredentials credentials = KlayCredentials.create(privateKey); // privateKey는 새로운 요청마다 동적으로 변경하며 사용

String userLogicAddr; // 배포된 컨트랙트의 주소값

UserLogic userLogic; // UserLogic은 UserLogic이라는 컨트랙트의 자바 클래스 파일

String txHash = null;

// 컨트랙트 로드

userLogic = UserLogic.load(

userLogicAddr, caver, credentials, chainId, new DefaultGasProvider(caver)

);

// 트랜잭션 전송

KlayTransactionReceipt.TransactionReceipt transactionReceipt = userLogic.testMethod(publicKey, action, actionCode).send();

// Receipt 확인

if(transactionReceipt != null) {

txHash = transactionReceipt.getTransactionHash();

res.setResponse(txHash, TX_CODE_SUCCESS, 0, null);

}

해당 코드로 보았을때 tx를 전송하고 receipt확인을 하고 있는데요.
해당 루틴이 thread로 몇개가 동시에 동작하고 있는지요?
tx를 지속적으로 보내기 위해서는 새로운 thread가 추가적으로 계속 발생될 수 있어야 합니다.

receipt확인하는 코드를 제거하고 연속적으로 tx를 발생시켜 보시면 어떨까 합니다.

코드를 보니 KLAY 전송이아닌 contract 실행으로 보이는데요.
참고로 KCT 전송의 경우는 KLVM (EVM)을 실행하기때문에서 4000 TPS보다는 조금 더 낮은 TPS가 나옵니다.
하지만 현재 100TPS 수준은 충분히 tx가 전달되지 못해서 그런것으로 보입니다.

이전 thread에서 제가 txpool.status를 확인해보시라고 한것도 확인해보시면 더 명확하게 알수 있을 것 같습니다.