Caver-java에서 TransactionReceipt가 null인 경우는 어떤 문제인가요?

Private SCN을 구동하여 컨트랙트를 배포하고 caver-java를 이용하여 컨트랙트를 실행하려 하는데
TransactionReceipt가 null이면 어떤 경우인가요?
private SCN 노드 하나로 컨트랙트 배포 및 트랜잭션 처리 모두 가능한가요?

  • 현재 SCN 노드만 구동중 입니다.

  • 계정이 보유한 Klay는 확인했습니다.

  • 컨트랙트의 배포 주소를 확인하고 컨트랙트의 view 함수의 기능은 확인했습니다.

  • caver-java 1.3.1

  • Baobob 테스트넷에 배포 후 정상 동작은 확인했습니다.

          Caver caver = Caver.build("http://54.180.118.248:7551"); // SCN URL
          			
          KlayCredentials credentials = KlayWalletUtils.loadCredentials(keyFilePw, keyFileDirPath+"/UTC--2020-03-04T08-01-27.821042500Z--82466b3d5f53c6adb0eaedf8c44fa6fad1057302.json");
          			
          Rena contract = Rena.load(
          	"0x1fd06cc5c36c976664b73e4f98bbb081ebca9729", caver, credentials, 9999, new DefaultGasProvider()
          );
      	
      	/* Test Point */
      	BigInteger testPoint = contract.getTestPoint().send();
      	System.out.println("[Test Point]:"+testPoint);
      	
      	KlayTransactionReceipt.TransactionReceipt transactionReceipt = contract.addTestPoint().send();
      	
                      // Receipt가 NULL
      	if(transactionReceipt != null) {
      		System.out.println("[TX HASH]:"+transactionReceipt.getTransactionHash());	
      	}
    

Contract

    pragma solidity >=0.4.21 <0.7.0;
    pragma experimental ABIEncoderV2;
    
    contract Rena {
    
        uint256 public testPoint = 100;
    
        /* Function */
        function getTestPoint() public view returns (uint256) {
            return testPoint;
        }
    
        function addTestPoint() public returns (bool) {
            testPoint = testPoint + 10;
            return true;
        }
    
    }

SCN Config

Configuration file for the kscnd

    SCSIGNER=
    SCSIGNER_PASSWD_FILE=   # Need to right password file for the keystore file of the scsigner address
    
    NETWORK_ID=9999
    
    PORT=22323 # 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=5
    
    # 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="mainbridge, subbridge, txpool,net,klay,subbridge,rpc,admin,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

안녕하세요, 먼저 질문해 주셔서 감사합니다.

확인해 본 결과, caver-java에서 Smart Contract 클래스와 관련된 버그로 확인되었습니다.
현재 버그 수정을 위한 변경 사항이 반영 되었으며, 이를 포함하여 rc버전으로 배포되었습니다.
관련된 PR은 링크 참고 부탁드립니다.
(PR : https://github.com/klaytn/caver-java/pull/77)

먼저 caver-java를 v1.3.2-rc.1 이상의 버전으로 사용하셔야 합니다.
질문에 올려 주신 코드를 바탕으로 수정한 이후 제대로 동작하는 테스트 코드를 작성하여 아래에 남깁니다.

    caver = Caver.build("http://0.0.0.0:7551"); // SCN URL

    Quantity chainId = caver.klay().getChainID().send();

    KlayCredentials testCredential = KlayCredentials.create("0xa70b79a6b587d257a4850767898d5f13e9417b6236b9af70880b1e8641e71fd8");
    KlayCredentials toCredential = KlayCredentials.create(Keys.createEcKeyPair());

    // Deploy smart contract
    JasmineTokenContract contractForDeployment = JasmineTokenContract.deploy(
            caver,
            testCredential,
            chainId.getValue().intValue(),
            new DefaultGasProvider(caver),
            "Jasmine",
            "JAS",
            BigInteger.valueOf(18),
            BigInteger.valueOf(100_000_000)
    ).send();

    // Load Smart Contract
    JasmineTokenContract contract = JasmineTokenContract.load(contractForDeployment.getContractAddress(), caver, testCredential, chainId.getValue().intValue(), *new DefaultGasProvider(caver)*);

    // Testing call method
    String name = contract.name().send();
    System.out.println("Token Contract name : " + name);

    // Testing send method
    KlayTransactionReceipt.TransactionReceipt transactionReceipt = contract.transfer(toCredential.getAddress(), BigInteger.ONE).send();

    if (transactionReceipt != null) {
        System.out.println("[TX HASH]:"+transactionReceipt.getTransactionHash());
    }

작성해 주신 코드에서 수정해 주셔야 하는 부분은 DefaultGasProvider를 생성할 때에 “new DefaultGasProvider(caver)” 이런 방식으로 caver를 파라미터로 전송해 주셔야 합니다.

먼저 질문하신 상황은 Gas unit price가 25Ston이 아닌 노드와 인터랙션 할 때에 생기는 문제입니다.
caver-java에서는 default로 gas price를 25Ston으로 세팅하고 있습니다.
또한 SmartContract 클래스에서는 gasProvider를 파라미터로 받으나, 실제로 트랜잭션을 생성할 때에 gasProvider의 gasPrice를 사용하고 있지 않는 버그 때문에 발생하는 문제였습니다.

위에 링크로 남긴 PR에는 이러한 버그들을 해결하였으며, new DefaultGasProvider(caver) 이렇게 caver를 defaultGasProvider에 파라미터로 전송하는 경우, Node에게 gasPrice를 물어보는 RPC콜을 날려 이 결과 값으로 gasPrice를 세팅하도록 변경되었습니다.

이해가 잘 안되시거나, 추가적인 질문 사항이 있는 경우 편하게 댓글로 남겨주세요 :slight_smile:

3 Likes

안녕하세요.
현재 서비스체인을 설치(mac 1개 scn)하고 EN 설치 없이 scn에 스마트컨트랙트 배포 및 테스트를 진행중에 있습니다.

질문 사항은

  1. klaytn IDE로 진행하려 했는데 SCN의 경우 설정은 어떻게 해야 하나요?
  1. doc.klaytn.com에서는 EN을 반드시 구축하거나, 퍼블릭 EN을 사용해야 하는 것처럼 보이는데 정확히 이해했는지 문의드립니다.
1 Like

안녕하세요 :slight_smile:
2번에 대한 답변을 먼저 드리겠습니다.

SCN만 가지고 스마트 컨트랙트 배포 및 실행이 가능합니다.
위의 댓글에 보시면, 1SCN을 구축하여 해당 노드에 스마트 컨트랙트를 배포하고, 배포된 스마트 컨트랙트를 실행한 코드를 참고하실 수 있습니다.

Klaytn IDE에서 SCN을 연결하는 방법에 대해서는 담당자에게 따로 문의드리겠습니다.

2 Likes

안녕하세요.

먼저, conf/kscnd.conf 파일을 아래처럼 수정 부탁드립니다.

  RPC_API="klay,subbridge,net,personal"

위 수정을 반영하시고 노드를 새로 띄우시면, 노드에서 net, personal API를 쓸 수 있습니다.

그리고, caver provider로 설정하게 되면 account정보들은 브라우저의 정보가 아니라, 노드에 저장된 월렛을 기본으로 동작하게 되어 있습니다.

이 이후에는 아래 deploy등을 실행하실 수 있습니다.

한 번 따라해 보시고 안되면 다시 질문 부탁드립니다.

감사합니다.

1 Like

항상 친절한 답변 감사드립니다. 정상적으로 동작 합니다.

1 Like

추가 질문이 있습니다. 1.3.2-rc.1와 관련하여 셋팅을 (https://bintray.com/klaytn/maven/caver-java)의 아래와 같이 설정하였습니다.

이경우 “Missing artifact com.klaytn.caver:codegen:pom:1.3.2- rc.1” 라는 에러가 발생합니다. 확인 부탁드립니다.
(1.3.1으로 설정할 경우에는 에러가 나지 않습니다)

안녕하세요, maven에 배포하는 과정이 추가적으로 1~2일 정도 더 소요될 것 같습니다.
maven에 정상적으로 caver-java v1.3.2-rc.1이 배포된 후에 다시 댓글 달겠습니다 ! :sweat_smile:

안녕하세요, maven에 caver-java v1.3.2-rc.1이 배포되었습니다.
확인해 보시고, 계속 에러가 발생한다면 다시 말씀해 주세요.