Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (4)
이전 글 보기
드디어 마지막이다. 저번 포스팅에서 Android에서 사용할 수 있도록 web3j를 통해 java class 를 Generate 했다. 이제 이 class를 Android 프로젝트에 넣어보자. (프로젝트 생성 과정은 생략한다.)
Web3j dependency 추가
우선 Android에서 Web3j를 이용하려면 의존성 추가를 해야 한다. app build.gradle에 해당 의존성을 추가하도록 한다.
implementation 'org.web3j:core:4.2.0-android'
그 다음, Sync를 진행해 준다. 이제 앞서 넣었던 java class 를 열어보자.
해야하는 작업
앞서 우리가 넣었던 java class파일을 열어보면 수 많은 에러가 반길 것이다. 하지만 겁 먹을 필요 없다. 우리가 필요한 것만 냅두고 전부 지워주면 되니까...
1. import 에러 두 줄 지우기.
2. RemoteFunctionCall -> RemoteCall로 변경
3. 에러가 나는 new Address(160, spender) 부분을 그냥 new Address(spender)로 변경한다.
4. 맨 아래부분에 Event를 담당하는 부분을 다 지워준다.
5. 남아있는 함수들 중 에러나는 함수를 다 지워주면 된다.
++ 2/12 추가 수정
사실 앞서 말한 BaseEventResponse같은 경우, 없어도 SmartContract 함수를 이용하는데는 큰 문제가 없지만 언젠가는 쓸 일이 있기에... 데이터를 좀 더 찾아보았더니, 그냥 Response를 extends해주면 된다. 위쪽에 관련 함수도 지울 필요 없다. 코드 살려놓으면 된다.
이렇게 하면 모든 에러가 깔끔하게 없어진다. 이제 본격적으로 SmartContract를 이용해 보도록 하자.
SmartContract를 이용해 봅시다.
Web3j 초기화
private Web3j web3;
...
public void InitWeb3j() {
web3 = Web3j.build(new HttpService("http://127.0.0.1:8545/"));
Web3ClientVersion web3ClientVersion = null;
try {
web3ClientVersion = web3.web3ClientVersion().sendAsync().get();
Log.d("Test", web3ClientVersion.getWeb3ClientVersion());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
이제 InitWeb3j 함수를 호출하게 되면,
D/Test: EthereumJS TestRPC/v2.8.0/ethereum-js
이렇게 버전이 뜨면서 정상적으로 Initializing 되었다.
Token 발행
앞서 1편에서도 말했지만, ganache에서 주는 ETH와 ERC20 프로토콜 SmartContract에서의 Token이랑은 다른 것이다. ETH는 SmartContract를 이용하면서 발생하는 수수료를 지불하기 위해 지급 된 것이다. 필자는 처음 공부할 때 Token과 코인(ETH)의 차이를 잘 숙지하지 못해 많이 고생했었다. (알고보면 간단한 것을...)
Token발행을 위해서는 해당 SmartContract를 Deploy(배포)한 사람만이 발행할 수 있기 때문에 우리는 Deployer의 Credential을 가져올 것이다. Deploy가 누구냐면.. 이전 편에서 보았듯이, Ganache에서는 0번째 index의 Account가 Deployer다. 발행 후 로그에 뜬 그 account다. 우리는 이 사람의 Credential을 이용하여, 특정 Account(주소)로 Token을 발행해 볼 것이다.
일단, Token Deployer 의 Credential 을 얻기 위해 Ganache에 들어가 해당 Account의 Private Key를 가져와 보자.
해당 Account 리스트에서 오른쪽에 보면 열쇠 모양의 버튼이 있는데, 이걸 눌러 Private Key 를 가져올 수 있다. Private key만으로는 Credential로 사용할 수 없다. 그래서 이 private key를 Credential로 다시 생성하는 함수를 추가한다.
private Credentials getCredential(String privateKeyInHex) {
BigInteger privateKeyInBT = new BigInteger(privateKeyInHex, 16);
ECKeyPair aPair = ECKeyPair.create(privateKeyInBT);
Credentials aCredential = Credentials.create(aPair);
return aCredential;
}
이제 Deployer 의 Credential을 만들었으니, web3j를 이용해 특정 Account에 Token을 발행시켜 보자.
0xa9218c729bf6A7853B0e712Bc0Fb5230bc7e975e 의 주소로 Token을 발행해 보겠다.
아까 위에서 복사해둔 private key를 getCredential 함수 호출하면서 인자값으로 넣고 credential을 Return받도록 코드를 구성하고, contract 생성 시 credential로 사용하게 한다. 그렇게 하면 우리가 원하는 Deployer의 계정(지갑)에 접근할 수 있다.
지금은 테스트 개발용이기 때문에 이렇게 하는 것이지, 실제 private key는 절대로 유출되어서는 안 되며, 본인만 가지고 있어야 한다.
public void requestContract() throws Exception {
Credentials crd = getCredential("be358faa63f531f46ed68f9f7c64578cfa84d16fad46c7af613b1b629920c78d");
MyToken contract = MyToken.load("0x3A7B37F731CdfaEd430C99800b34a5937e4D3dA0", web3, crd, BigInteger.valueOf(2000L), BigInteger.valueOf(1000000L));
Log.d("Test A의 잔액", String.valueOf(contract.balanceOf("0xa9218c729bf6A7853B0e712Bc0Fb5230bc7e975e").send()));
contract.mint("0xa9218c729bf6A7853B0e712Bc0Fb5230bc7e975e", BigInteger.valueOf(1000L)).sendAsync().get();
Log.d("Test A의 잔액", String.valueOf(contract.balanceOf("0xa9218c729bf6A7853B0e712Bc0Fb5230bc7e975e").send()));
}
이제 앱에서 requestContract 함수를 호출시켜보자. button을 만들어서 호출해도 되고 상관없다. 아무튼 코드가 실행이 되면, 아래와 같은 결과를 Logcat에서 볼 수 있다.
D/Test A의 잔액: 0
D/Test A의 잔액: 1000
처음에는 0개의 Token이 존재했지만, mint 함수 호출 후 이후 1000개의 Token이 발행됐다.
주의할 점은 SmartContract Deployer가 아니라면, 절대로 mint함수를 사용하여 Token을 발행할 수 없다. 여기서 응용을 하자면, 예를들어 A사용자에게 100개의 Token을 발행하고, A사용자의 Credential로 접근하여 .transfer 함수를 이용해 다른 Account로 Token을 전송해 보는 것 까지 만들어 볼 수 있겠다.
결론
ERC20 말고도 정말 다양한 형태의 프로토콜이 있으며, 그런 프로토콜로 만들어진 다양한 Smart Contract가 있다. 지금은 ERC20을 사용하여 SamrtContract를 배포, Token을 발행 했지만, ERC1484와 같은 프로토콜을 이용하여 DID(분산신원증명)을 구현해 볼 수도 있다. 우리가 구현해본 ERC20은 특정 앱 내에서는 이 토큰이 포인트로 적용되어 사용될 수 있다. 뭐 메인넷에 올렸을 때 gas 비용(수수료) 처리 같은 문제는,,, 알아서 하길 바란다. 아무튼 블록체인 시스템은 이런거구나~ 가 중요한 거니까...
아무튼, 앞으로도 BlockChain을 활용한 서비스가 많이 개발 되어졌으면 하는 바램이다.
'BlockChain' 카테고리의 다른 글
댓글
이 글 공유하기
다른 글
-
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (3)
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (3)
2020.02.05 -
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (2)
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (2)
2020.02.04 -
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (1)
Ganache + Solidity + ERC20을 활용한 Ethereum SmartContract 배포 및 Android 통신 (1)
2020.02.04