Coder Social home page Coder Social logo

apratt3377 / web3j-quorum Goto Github PK

View Code? Open in Web Editor NEW

This project forked from web3j/web3j-quorum

0.0 0.0 0.0 413 KB

web3j integration layer for JP Morgan's Quorum

Home Page: https://www.web3labs.com

License: Other

Java 74.46% Kotlin 24.28% Shell 1.26%

web3j-quorum's Introduction

web3j-quorum: Java integration library for Quorum

https://travis-ci.org/web3j/web3j-quorum.svg?branch=master

web3j-quorum is an extension to web3j providing support for JP Morgan's Quorum API.

web3j is a lightweight, reactive, type safe Java library for integrating with clients (nodes) on distributed ledger or blockchain networks.

For further information on web3j, please refer to the main project page and the documentation at Read the Docs.

Features

  • Support for Quorum's private transactions through private transaction manager
  • Ability to send signed private transactions
  • Works out the box with web3j's smart contract wrappers

Getting started

Add the relevant dependency to your project:

Maven

Java 8:

<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>quorum</artifactId>
  <version>4.0.6</version>
</dependency>

Gradle

Java 8:

compile ('org.web3j:quorum:4.0.6')

Run Quorum

See instructions as per the Quorum project page

Start sending requests

To send synchronous requests:

Quorum quorum = Quorum.build(new HttpService("http://localhost:22001"));
Web3ClientVersion web3ClientVersion = quorum.web3ClientVersion().send();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();

To send asynchronous requests:

Quorum quorum = Quorum.build(new HttpService("http://localhost:22001"));
Web3ClientVersion web3ClientVersion = quorum.web3ClientVersion().sendAsync().get();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();

To use an RxJava Observable:

Quorum quorum = Quorum.build(new HttpService("http://localhost:22001"));
quorum.web3ClientVersion().observable().subscribe(x -> {
    String clientVersion = x.getWeb3ClientVersion();
    ...
});

IPC

web3j also supports fast inter-process communication (IPC) via file sockets to clients running on the same host as web3j. To connect simply use UnixIpcService or WindowsIpcService instead of HttpService when you create your service:

// OS X/Linux/Unix:
Quorum quorum = Quorum.build(new UnixIpcService("/path/to/socketfile"));
...

// Windows
Quorum quorum = Quorum.build(new WindowsIpcService("/path/to/namedpipefile"));
...

Smart Contract Wrappers

Smart contract wrappers generated using web3j 2.0+ work out the box with with web3j-quorum.

The only difference is that you'll need to use the Quorum ClientTransactionManager:

QuorumTransactionManager transactionManager = new QuorumTransactionManager(
        web3j, "0x<from-address>", Arrays.asList("<privateFor-public-key>", ...);
YourSmartContract contract = YourSmartContract.deploy(
    <web3j>, <transactionManager>, GAS_PRICE, GAS_LIMIT,
    <param1>, ..., <paramN>).send();

These wrappers are similar to the web3j smart contract wrappers with the exception that the transactions are signed by the Quorum nodes rather then by web3j. They also support the privateFor field on transactions.

See the web3j documentation for a detailed overview of smart contracts and web3j.

Sending Raw Private Transactions

web3j supports sending raw private transactions through a connection to Quorum Transaction Managers. Code examples

Connection to Tessera via HTTP

Credentials credentials = ...
//connect to quorum node via http or ipc as described above
Quorum quorum = ...

EnclaveService enclaveService = new EnclaveService("http://TESSERA_THIRD_PARTY_URL", TESSERA_THIRD_PARTY_PORT, httpClient);
Enclave enclave = new Tessera(enclaveService, quorum);

QuorumTransactionManager qrtxm = new QuorumTransactionManager(
    quorum, credentials, TM_FROM_KEY, Arrays.asList(TM_TO_KEY_ARRAY),
    enclave,
    30,     // Retry times
    2000);  // Sleep

Connection to Tessera via IPC

Credentials credentials = ...
//connect to quorum node via http or ipc as described above
Quorum quorum = ...

//build http client that supports ipc connection
UnixDomainSocketFactory socketFactory = new UnixDomainSocketFactory(new File("TESSERA_IPC_PATH"));
     OkHttpClient client = new OkHttpClient.Builder()
             .socketFactory(socketFactory)
             .build();

EnclaveService enclaveService = new EnclaveService("http://localhost", TESSERA_THIRD_PARTY_PORT, client);
Enclave enclave = new Tessera(enclaveService, quorum);

QuorumTransactionManager qrtxm = new QuorumTransactionManager(
    quorum, credentials, TM_FROM_KEY, Arrays.asList(TM_TO_KEY_ARRAY),
    enclave,
    30,     // Retry times
    2000);  // Sleep

Connection to Constellation via IPC

Credentials credentials = ...
//connect to quorum node via http or ipc as described above
Quorum quorum = ...

//build http client that supports ipc connection
UnixDomainSocketFactory socketFactory = new UnixDomainSocketFactory(new File("CONSTELLATION_IPC_PATH"));
     OkHttpClient client = new OkHttpClient.Builder()
             .socketFactory(socketFactory)
             .build();

EnclaveService enclaveService = new EnclaveService("http://localhost", CONSTELLATION_THIRD_PARTY_PORT, client);
Enclave enclave = new Constellation(enclaveService, quorum);

QuorumTransactionManager qrtxm = new QuorumTransactionManager(
    quorum, credentials, TM_FROM_KEY, Arrays.asList(TM_TO_KEY_ARRAY),
    enclave,
    30,     // Retry times
    2000);  // Sleep

Using the QuorumTransactionManager with Smart Contract Wrappers

YourSmartContract.deploy(quorum,
    qrtxm,
    GAS_PRICE, GAS_LIMIT,
    <param1>, ..., <paramN>).send();

Using the QuorumTransactionManager alone

Using a single QuorumTransactionManager method signAndSend

RawTransaction rawTransaction = ...
EthSendTransaction ethSendTransaction = qrtxm.signAndSend(rawTransaction);

Using multiple exposed QuorumTransactionManager methods (storeRawRequest, sign, sendRaw)

//send raw bytecode to QuorumTranasctionManager
SendResponse storeRawResponse = qrtxm.storeRawRequest(HEX_ENCODED_SMARTCONTRACT_BYTECODE, TM_FROM_KEY, Arrays.asList(TM_TO_KEY_ARRAY));
String tesseraTxHash = Numeric.toHexString(Base64.getDecoder().decode(storeRawResponse.getKey()));

//create raw transaction with hash returned from QuorumTransactionManager
RawTransaction rawTransaction = ...

//sign raw transaction
String signedTx = qrtxm.sign(rawTransaction);

//send signed raw transaction to quorum node
EthSendTransaction ethSendTransaction = qrtxm.sendRaw(signedTx, Arrays.asList(TM_TO_KEY_ARRAY));

Retrieving a private transaction payload with Enclave receive method

String payload = enclave.receiveRequest(tesseraTxHash, TM_TO_KEY);

Full sample code

Sample code for sending raw private transactions via smart contract, QuorumTransactionManager and Enclave

Using web3j RawTransactionManager

// Raw txn
RawTransactionManager qrtxm = new RawTransactionManager(
      quorum,
      credentials,
      30,     // Retry times
      2000);  // Sleep

YourSmartContract.deploy(quorum,
      qrtxm,
      GAS_PRICE, GAS_LIMIT,
      <param1>, ..., <paramN>).send();

web3j-quorum's People

Contributors

alexandrour avatar antonydenyer avatar apratt3377 avatar conor10 avatar fixanoid avatar iikirilov avatar nicolae-leonte-go avatar puneetha17 avatar sebaraba avatar snazha-blkio avatar vjrantal avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.