본문 바로가기
개발/삼성 블록체인 플랫폼 SDK

삼성 블록체인 플랫폼 SDK 사용하기 (3) Account 생성 및 가져오기

by 손너잘 2020. 2. 11.
계좌 생성
 
지갑을 가지고 온 뒤 Account가 없을 경우 Account를 생성해 주어야 한다. 기존의 Account가 존재할 경우 AccountManager의 getAccount를 이용하여 Account 정보들을 가지고 올 수 있다.
Account를 생성하기 위해서는 CoinNetworkInfo 객체가 필요하다. 이를 통해 어떤 코인에 대한 계정을 생성할 것 인지, 또한 테스트넷 기반인지 메인넷 기반인지를 설정할 수 있다.
CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
        CoinType.ETH,                   //코인 종류
        EthereumNetworkType.ROPSTEN,    //네트워크 종류
        rpcAddress                    //노드 정보
);
 
CoinNetworkInfo 객체는 위와같이 생성한다. 현재 삼성 블록체인 SDK는 이더리움만 지원하고 있으므로 위 설정에서 네트워크 종류와 노드 정보만 바꿔주면 될 것 이다.
본 포스팅에서는 ROPSTEN 테스트넷을 기반으로 실행하도록 한다.
노드정보같은 경우는 rpc 통신을 할 노드의 주소를 적어주면 되는데 geth를 돌리고 있을경우 그 rpc connectiion point를 적어주면 되고 infura를 사용하여 그 정보를 적어주어도 된다.
이때 인터넷을 사용하기 때문에 인터넷 퍼미션에 대한 허가를 줘야 한다. 메니페스트 파일에서 설정하도록 하자.
 
인터넷을 사용하는 이유는 SDK 가 HDWALLET 기반으로 생성되었기 때문이다. HDWALLET에 의거하여 생성된 Account가 사용된 적이 있는지에 대한 질의를 노드에게 하게 된다.
 
mSblockchain.getAccountManager()
        .generateNewAccount(wallet, coinNetworkInfo)
        .setCallback(new ListenableFutureTask.Callback<Account>() {
            @Override
            public void onSuccess(Account account) {
                Log.d("Account Information", account.toString());
            }
 
 
            @Override
            public void onFailure(@NotNull ExecutionException e) {
            }
 
 
            @Override
            public void onCancelled(@NotNull InterruptedException e) {
            }
        });
 
Acocunt는 위와같이 생성한다. 맨 처음 생성한 mSblockchain 객체의 getAccountManager 메소드를 통해 AccountManager를 가지고 오고 generateNewAccount를 생성한다.
그러면 그에대한 콜백으로 만들어진 Account에 대한 정보를 반환하게 된다.
 
I/SBlockchain: AccountManagerImpl.generateNewAccount() result: EthereumAccount(tokenAddress=null) Account(coinType=ETH, networkType=ROPSTEN, address='0x7844********************************0a12', hdPath=m/44'/60'/0'/0/1, walletId=0x1412********************************************************28dc)
 
정상적으로 Account가 생성되었다면 위와 같은 로그가 생성된다. 만일 위 로그가 발생하지 않는다면 onFailure 또는 onCancelled 의 exception을 print시켜서 어떤 에러가 뜨는지 확인해 보도록 하자.
 
E/SBlockchain: SBlockChainException.SDK version : 1.0.00
    AccountManagerImpl:Failed to create new account. There's unused one.
E/SBlockchain: com.samsung.android.sdk.blockchain.exception.AccountException: Failed to create new account. There's unused one.
        at com.samsung.android.sdk.blockchain.i.f.b(SourceFile:224)
        at com.samsung.android.sdk.blockchain.i.f.a(SourceFile:36)
        at com.samsung.android.sdk.blockchain.i.f$c.a(SourceFile:82)
        at com.samsung.android.sdk.blockchain.i.f$c.call(SourceFile:36)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
 
모든게 정상인것 같은데 위와 같은 오류가 날 수 있다. 삼성 SDK는 한번 만들어진 Account가 사용되지 않은 상태에서 새로운 Account를 생성하고자 하면 저런 에러를 발생시킨다. 따라서 기존에 있는 Account 중 사용하지 않은 Account를 이용하여 트랜젝션을 하나라도 발생시킨 후 실행하면 된다.
 
 
계좌 가져오기
 
만들어진 Account를 가지고 오는것은 더운 간단하다. AccountManager 인스턴스를 가지고 온 뒤 get Account 메소드를 실행해 주면 된다.
private void getAccounts() {
    List<Account> lists = mSblockchain.getAccountManager()
            .getAccounts(wallet.getWalletId(), CoinType.ETH, EthereumNetworkType.ROPSTEN);
 
 
    // Arrays.toString(new LIst[]{accounts};
 
 
    for(int i=0; i<lists.size(); i++) {
        Account account = lists.get(i);
        Log.d("Accounts", account.toString());
    }
}
 
이와 같은 방식으로 Account 정보들을 가지고 올 수 있게 된다.
 
I/SBlockchain: AccountManagerImpl.getAccounts() walletId: 0x1412**********..., coinType: ETH, networkType: ROPSTEN
I/SBlockchain: AccountManagerImpl.getAccounts() result: [EthereumAccount(tokenAddress=null) Account(coinType=ETH, networkType=ROPSTEN, address='0x7844********************************0a12', hdPath=m/44'/60'/0'/0/1, walletId=0x1412********************************************************28dc)]
D/Accounts0: EthereumAccount(tokenAddress=null) Account(coinType=ETH, networkType=ROPSTEN, address='0x7844********************************0a12', hdPath=m/44'/60'/0'/0/1, walletId=0x1412********************************************************28dc)
 
정상적으로 Account 정보를 가지고 오면 다음과 같은 로그를 확인할 수 있다. 현재 생성된 Account가 하나뿐이기 때문에 하나의 Account 정보만 불러오는것을 알 수 있다.
이때 우리가 생성한 Wallet address를 우리는 확인할 수 없다.
이때 디버거를 사용하여 이를 해결할 수 있다.
Account 객체를 출력하는 부분에 breakpoint를 걸고 그 객체를 확인해 보자.
 
위와같이 별표된 정보들이 보인다. 메타마스크와 파우셋을 통해 위 address에 이더를 보내고 테스트를 진행 할 것이다.
 
위 address는 테스트용 address이기 때문에 저기로 돈 보내지 말고 제 계좌로 넣어주세요 감사합니다.
 
 
메타마스크를 통해 삼성 blockchain sdk 를 통해 생성한 Account로 4 이더리움을 전송하였다. 
이제 우리는 테스트를 할 자금을 확보하였다.

댓글