RPC API 사용하기

아래는 Symverse Blockchain 의 RPC API 를 호출하는 방식에 대한 설명 문서입니다.

블록체인 노드에서 제공하는 JSON RPC API를 JAVA 언어로 변환한 코드입니다. 노드에서 제공하는 상세한 API 가 궁금하시다면 해당 링크를 참고해 주시기 바랍니다.

Symverse 노드 접속

API를 호출하기 위해선 아래 Service 코드를 작성해야합니다.

// 테스트넷 노드 연결 시 Network.TEST_NET 삽입
Network network = Network.MAIN_NET 
// Network network = Network.TEST_NET 

SymHttpService httpService = new SymHttpService(PublicWorkNode.fromNetwork(network)
GSymCitizen gsym = GSymCitizen.build(httpService);

메인넷과 테스트넷은 퍼블릭 체인으로써 각 고정으로 사용하는 호스트 정보를 라이브러리 내부에서 관리하고 있습니다. 따라서 개발자는 실제 호스트 주소의 정보를 알 필요 없이 PublicWorkNode.fromNetwork함수를 통해 특정 네트워크에 해당하는 호스트를 랜덤으로 요청할 수 있습니다.

블록체인 데이터 호출하기

블록체인에 기록된 정보(Block, Transaction, Citiz, SCT) 를 조회하기 위해서 아래와 같이 작성합니다.

Block 조회

메인 블록 정보를 조회 합니다

// 조회할 블록 number 지정
DefaultBlockParameterNumber number = DefaultBlockParameter.valueOf(SymUtil.big(1001);
// 가장 마지막 블록 조회 시
//DefaultBlockParameterName number = DefaultBlockParameterName.LATEST;

// 두번째 파라미터는 블록에 포함된 트랜잭션 상세 여부
SymBlock block = gsym.symGetBlockByNumber((number), true).send();

Transaction Nonce 조회

유저의 SymID가 현재까지 발행한 트랜잭션 count를 조회합니다.

SymGetTransactionCount count = gSymWeb3j.symGetTransactionCount(SymUtil.appendPrefixHex("0002aea7a09991500002"), DefaultBlockParameterName.LATEST).send();

Transaction 조회

트랜잭션 해쉬(hash) 기반으로 트랜젹션 기록을 조회 합니다

SymTransaction transaction = gsym.symGetTransactionByHash("0x10aac13794eae0488dd034dc8a3774714fb9eccafe931a40429c92604ecace0f").send();

Transaction Receipt 조회

트랜잭션 해쉬(hash) 기반으로 트랜젹션 영수증을 조회 합니다

SymTransactionReceipt receipt = gsym.symGetTransactionReceipt("0x10aac13794eae0488dd034dc8a3774714fb9eccafe931a40429c92604ecace0f").send();

DID 조회

SymID 기반으로 DID 정보를 조회 합니다

SymGetCitizen citizen = gSymWeb3j.citizenBySymId("0x0002eb055e4a51cd0002", DefaultBlockParameterName.LATEST).send();

SCT 조회

SCT API를 통해 생성된 Token의 정보를 조회합니다

// SCT 주소
String testSctAddress = "0xff89fc8f8050e05fff64";

SymSCTGetContract contract = gSymWeb3j.sctGetContract(testSctAddress).send();

트랜잭션 전송하기

트랜잭션을 전송하기 위해서는 반드시 서명에 필요한 Keystore가 필요합니다. 때문에 API를 사용하기 위해서는 지갑에서 Keystore 를 Export 한 뒤 사용해주시기 바랍니다.

기본 트랜잭션 전송

트랜잭션을 전송하기 위해서는 symGetTransactionCount 함수를 통해 반드시 트랜잭션의 Nonce값을 작성해야합니다. ( 이중 지불 문제 방지 )

// symid nonce 값 구하기
SymGetTransactionCount nonce = gSymWeb3j.symGetTransactionCount(walletFile.getSymId(), DefaultBlockParameterName.PENDING).send();

// 노드 선택
GsymNode workNode = PublicWorkNode.fromNetwork(Network.TEST_NET);

// 트랜잭션 메시지 서명
RLPRawTransaction rawTransaction = new RLPRawTransaction.Builder()
        .setFrom(walletFile.getSymId()) // 보내는 SymID
        .setTo(SymUtil.appendPrefixHex("00024f48413a322b0002")) // 받는 SymID
        .setNonce(nonce.getTransactionCount()) 
        .setValue(SymUtil.toSym(100)) // SYM 개수
        .setWarrantNode(workNode.getNodeBaseSymId()) 
        .build(credentials, Network.TEST_NET.getChainId());

// 트랜잭션 전송
SymSendRawTransaction symSendRawTransaction = gSymWeb3j.symSendRawTransaction(rawTransaction.hexSignMessage()).send();

if ( symSendRawTransaction.hasError()){
    //에러처리
}

System.out.println(symSendRawTransaction.getTransactionHash());

SCT 트랜잭션 전송

SCT의 경우 Sct.Maker 가 존재합니다. 해당 클래스를 통해서 손 쉽게 파라미터를 작성할 수 있습니다.

아래 예제는 SCT21에 대한 생성 코드 입니다.

// symid nonce 값 구하기
SymGetTransactionCount nonce = gSymWeb3j.symGetTransactionCount(walletFile.getSymId(), DefaultBlockParameterName.PENDING).send();

// 노드 선택
GsymNode workNode = PublicWorkNode.fromNetwork(Network.TEST_NET);

// "SCT21 생성" 파라미터 생성
Sct21Maker sct21Create = new Sct.Sct21Maker()
        .create(
        "SYMVERSE", 
        "SYM", 
        SymUtil.toSym(1000), 
        BigInteger.ZERO, 
        walletFile.getSymId()
)

// "SCT21 토큰 전송" 파라미터 생성
//new Sct.Sct21Maker().transfer("00024f48413a322b0002", SymUtil.toSym(5));


// SCT 메시지 서명
RLPRawTransaction rawTransaction = new RLPRawTransaction.Builder()
        .setFrom(walletFile.getSymId()) // 보내는 SymID
        .setSct(sct21Token)
        .setContractAddress(null)
        .setNonce(nonce.getTransactionCount()) 
        .setWarrantNode(workNode.getNodeBaseSymId()) 
        .build(credentials, Network.TEST_NET.getChainId());

// 트랜잭션 전송
SymSendRawTransaction sctSendRawTransaction = gSymWeb3j.symSendRawTransaction(rawTransaction.hexSignMessage()).send();

if ( symSendRawTransaction.hasError()){
    //에러처리
}

System.out.println(sctSendRawTransaction.getTransactionHash());

Last updated