1. 소개
이 예제에서는 널리 사용되는 Web3 추상화 라이브러리의 Java 구현인 Web3j를 소개합니다.
Web3j는 JSON-RPC 또는 HTTP, WebSockets, IPC와 같은 친숙한 표준을 사용하여 Ethereum 노드에 연결하여 Ethereum 네트워크와 상호 작용하는 데 사용됩니다 .
Ethereum은 그 자체로 전체 주제이므로 먼저 그것이 무엇인지 간단히 살펴 보겠습니다!
2. 이더리움
이더리움은 (1) 암호화폐 (토큰 심볼 ETH ), (2) 분산 슈퍼컴퓨터, (3) 블록체인, (4) Solidity로 작성된 스마트 계약 네트워크입니다 .
즉, 이더리움( 네트워크 )은 일종의 메시 토폴로지(기술적으로 이것은 정확하지 않지만 작동 방식에 대한 보다 확실한 이해를 얻을 수 있을 만큼 가깝습니다)로 통신하는 노드 라고 하는 연결된 서버 무리에 의해 실행됩니다. .
Web3j 및라는 상위 라이브러리 Web3는 , 수 있습니다 웹 응용 프로그램은 그 중 하나에 연결하는 노드 하여 에테 리움의 제출 거래 , 모든 의도와 목적이며, 컴파일 견고 스마트 계약 기능 이전에 에테 리움의에 배포 된 네트워크를 . 스마트 계약에 대한 자세한 내용은 여기 에서 Solidity로 스마트 계약 생성 및 배포에 대한 기사를 참조 하십시오 .
각 노드는 다른 모든 그것의 변경 브로드 캐스트 노드를 그 합의와 검증을 달성 할 수 있습니다. 따라서 각 노드 는 이더리움 블록체인 의 전체 기록을 동시에 포함 하므로 변조 방지 방식으로 네트워크 의 다른 모든 노드 에 의한 합의 및 검증을 통해 모든 데이터의 중복 백업을 생성 합니다 .\
이더리움에 대한 자세한 내용은 공식 페이지 를 확인 하세요 .
3. 설정
Web3j에서 제공하는 전체 기능을 사용하려면 평소보다 설정을 위해 조금 더 해야 합니다. 첫째, Web3j는 코어 pom.xml 의존성에 선택적으로 추가될 수 있는 여러 독립 모듈로 제공됩니다 .
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.3.1</version>
</dependency>
노트는 것을 바랍니다 Web3j의 팀은 일부 구성하고 제한된 기능으로 사전 구축 된 Spring 부팅 스타터를 제공 오른쪽에 내장!
우리는 이 기사의 핵심 기능에 초점을 맞출 것입니다.
이러한 모듈의 전체 List은 Maven Central 에서 찾을 수 있습니다 .
3.1. 계약 컴파일: Truffle 또는 Solc
Ethereum 스마트 계약( .solc 파일) 을 컴파일하고 배포하는 두 가지 기본 방법이 있습니다 .
우리는 이 기사에서 Truffle을 사용할 것입니다. Truffle은 스마트 계약을 컴파일하고 마이그레이션하고 네트워크에 배포하는 프로세스를 단순화하고 추상화합니다 . 또한 Solc 컴파일러를 래핑하여 두 가지 모두에 대해 약간의 경험을 얻을 수 있습니다.
트러플을 설정하려면:
$ npm install truffle -g
$ truffle version
각각 프로젝트를 초기화하고, 앱을 컴파일하고, 앱을 블록체인에 배포하고, 테스트하는 데 사용할 4가지 주요 명령:
$ truffle init
$ truffle compile
$ truffle migrate
$ truffle test
이제 간단한 예를 살펴보겠습니다.
pragma solidity ^0.4.17;
contract Example {
function Example() {
// constructor
}
}
컴파일 시 다음 ABI JSON을 생성해야 합니다.
{
"contractName": "Example",
"abi": [
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
}
],
"bytecode": "0x60606040523415600e57600080fd5b603580601b6...,
"deployedBytecode": "0x6060604052600080fd00a165627a7a72305...,
//...
}
그런 다음 애플리케이션 내에서 제공된 바이트 코드와 ABI를 사용하여 배포된 계약과 상호 작용할 수 있습니다!
3.2. 테스트 계약: 가나슈
Ethereum 테스트넷으로 작업하는 가장 쉬운 방법 중 하나는 자체 Ganache 서버 를 시작하는 것 입니다. 설정 및 구성이 가장 쉽기 때문에 사전 구축된 즉시 사용 가능한 솔루션을 사용합니다. 또한 Ganache를 내부적으로 구동하는 Ganache CLI용 인터페이스 및 서버 쉘을 제공합니다.
기본 제공된 URL 주소인 http://localhost:8545 또는 http://localhost:7545 에서 Ganache 서버에 연결할 수 있습니다 .
Meta-Mask , Infura 또는 Go-Lang 및 Geth 사용을 포함하여 테스트 네트워크를 설정하는 몇 가지 다른 인기 있는 접근 방식이 있습니다.
고유한 GoLang 인스턴스를 설정(및 사용자 지정 테스트넷으로 구성)할 수 있고 Chrome에서 Meta-Mask의 상태가 현재 불확실하기 때문에 이 기사에서는 Ganache를 고수합니다.
Ganache를 수동 테스트 시나리오(디버깅 또는 통합 테스트 완료 시)에 사용하거나 자동화된 테스트 시나리오(이러한 상황에서는 사용 가능한 엔드포인트가 없을 수 있으므로 테스트를 빌드해야 함)에 사용할 수 있습니다.
4. Web3와 RPC
Web3는 이더리움 블록체인 및 이더리움 서버 노드와 쉽게 상호 작용할 수 있는 파사드 및 인터페이스를 제공합니다. 즉, Web3 는 JSON-RPC를 통해 클라이언트와 이더리움 블록체인 간의 통신을 용이하게 합니다. Web3J는 공식 자바 포트입니다 Web3 .
공급자(예: 타사 또는 로컬 Ethereum 노드의 끝점)를 전달하여 응용 프로그램 내에서 사용하기 위해 Web3j를 초기화할 수 있습니다.
Web3j web3a = Web3j.build(new HttpService());
Web3j web3b = Web3j.build(new HttpService("YOUR_PROVIDER_HERE"));
Web3j myEtherWallet = Web3j.build(
new HttpService("https://api.myetherapi.com/eth"));
세 번째 옵션은 제3자 제공자를 추가하는 방법을 보여줍니다(따라서 이더리움 노드와 연결). 그러나 공급자 옵션을 비워 둘 수도 있습니다. 이 경우 기본 포트가 대신 localhost 에서 사용됩니다( 8545 ) .
5. 필수 Web3 메소드
이제 이더리움 블록체인과 통신하기 위해 앱을 초기화하는 방법을 알았으므로 이더리움 블록체인과 상호 작용하는 몇 가지 핵심 방법을 살펴보겠습니다.
구성된 이더리움 노드에 대한 JSON-RPC 요청의 비동기 특성을 처리하기 위해 CompleteableFuture 로 Web3 메서드를 래핑하는 것이 좋은 정책 입니다.
5.1. 현재 블록 번호
예를 들어 현재 블록 번호를 반환할 수 있습니다 .
public EthBlockNumber getBlockNumber() {
EthBlockNumber result = new EthBlockNumber();
result = this.web3j.ethBlockNumber()
.sendAsync()
.get();
return result;
}
5.2. 계정
지정된 주소 의 계정 을 얻으려면 :
public EthAccounts getEthAccounts() {
EthAccounts result = new EthAccounts();
result = this.web3j.ethAccounts()
.sendAsync()
.get();
return result;
}
5.3. 계좌 거래 건수
주어진 주소의 트랜잭션 수 를 얻으려면 :
public EthGetTransactionCount getTransactionCount() {
EthGetTransactionCount result = new EthGetTransactionCount();
result = this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS,
DefaultBlockParameter.valueOf("latest"))
.sendAsync()
.get();
return result;
}
5.4. 계정 잔액
마지막으로 주소 또는 지갑 의 현재 잔액을 확인하려면:
public EthGetBalance getEthBalance() {
EthGetBalance result = new EthGetBalance();
this.web3j.ethGetBalance(DEFAULT_ADDRESS,
DefaultBlockParameter.valueOf("latest"))
.sendAsync()
.get();
return result;
}
6. Web3j에서 계약 작업
Truffle을 사용하여 Solidity 계약을 컴파일한 후에는 여기에서 사용 가능한 독립 실행형 Web3j 명령줄 도구를 사용 하거나 여기 에서 독립형 zip으로 사용하여 컴파일된 ABI ( 응용 프로그램 바이너리 인터페이스 ) 로 작업할 수 있습니다 .
6.1. CLI 매직
그런 다음 다음 명령을 사용하여 Java 스마트 계약 래퍼(기본적으로 스마트 계약 ABI를 노출하는 POJO)를 자동으로 생성할 수 있습니다.
$ web3j truffle generate [--javaTypes|--solidityTypes]
/path/to/<truffle-smart-contract-output>.json
-o /path/to/src/main/java -p com.your.organisation.name
프로젝트의 루트에서 다음 명령을 실행합니다.
web3j truffle generate dev_truffle/build/contracts/Example.json
-o src/main/java/com/baeldung/web3/contract -p com.baeldung
예제 클래스를 생성했습니다 .
public class Example extends Contract {
private static final String BINARY = "0x60606040523415600e576...";
//...
}
6.2. 자바 POJO
이제 스마트 계약 래퍼 가 있으므로 프로그래밍 방식으로 지갑을 만든 다음 해당 주소에 계약을 배포할 수 있습니다 .
WalletUtils.generateNewWalletFile("PASSWORD", new File("/path/to/destination"), true);
Credentials credentials = WalletUtils.loadCredentials("PASSWORD", "/path/to/walletfile");
6.3. 계약 배포
다음과 같이 계약을 배포할 수 있습니다.
Example contract = Example.deploy(this.web3j,
credentials,
ManagedTransaction.GAS_PRICE,
Contract.GAS_LIMIT).send();
그런 다음 주소를 가져옵니다.
contractAddress = contract.getContractAddress();
6.4. 트랜잭션 보내기
송신하려면 트랜잭션을 사용하는 기능 우리의 계약을 우리가 Web3j를 초기화 할 수 있습니다 기능 A를 List 입력 값과 List 출력 매개 변수를 :
List inputParams = new ArrayList();
List outputParams = new ArrayList();
Function function = new Function("fuctionName", inputParams, outputParams);
String encodedFunction = FunctionEncoder.encode(function);
그런 다음 필요한 가스 ( Transaction 실행에 사용됨 )와 nonce 매개변수를 사용하여 트랜잭션 을 초기화할 수 있습니다 .
BigInteger nonce = BigInteger.valueOf(100);
BigInteger gasprice = BigInteger.valueOf(100);
BigInteger gaslimit = BigInteger.valueOf(100);
Transaction transaction = Transaction
.createFunctionCallTransaction("FROM_ADDRESS",
nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction);
EthSendTransaction transactionResponse = web3j.ethSendTransaction(transaction).sendAsync().get();
transactionHash = transactionResponse.getTransactionHash();
스마트 계약 기능의 전체 List은 공식 문서를 참조하십시오 .
7. 결론
그게 다야! Web3j로 Java Spring MVC 앱을 설정했습니다. 지금은 블록체인 시대입니다!