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 파일) 을 컴파일하고 배포하는 두 가지 기본 방법이 있습니다 .

  1. 공식 Solidity 컴파일러.
  2. Truffle  (스마트 계약을 테스트, 배포 및 관리하기 위한 추상화 제품군).

우리는 이 기사에서 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 요청의 비동기 특성을 처리하기 위해 CompleteableFutureWeb3 메서드를 래핑하는 것이 좋은 정책 입니다.

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 앱을 설정했습니다. 지금은 블록체인 시대입니다!

항상 그렇듯이 이 문서에 사용된 코드 예제는 GitHub 에서 사용할 수 있습니다 .

Security footer banner