Giter Site home page Giter Site logo

hyperchain / javasdk Goto Github PK

View Code? Open in Web Editor NEW
66.0 7.0 37.0 1.77 MB

the Java SDK for hyperchain (developing)

Home Page: http://docs.hyperchain.cn

License: GNU Lesser General Public License v3.0

Java 98.75% Shell 0.54% Solidity 0.22% Rust 0.49%
hyperchain blockchain java sdk

javasdk's Introduction

LITESDK

License: LGPL v3 Build Status Coverage Status

Get started

Install

Maven

<dependency>
    <groupId>cn.hyperchain</groupId>
    <artifactId>litesdk</artifactId>
    <version>x.x.x</version>
</dependency>

Gradle

compile group: 'cn.hyperchain', name: 'litesdk', version: 'x.x.x'

It's better to use latest sdk to send transaction, now it will be compatible with hyperchain 1.0 and 2.0

Usage

1. build provider manager

Provider can be expanded by user, we support default http provider.

Then create provider manager.

String DEFAULT_URL = "localhost:8081";
DefaultHttpProvider defaultHttpProvider = new DefaultHttpProvider.Builder().setUrl(DEFAULT_URL).build();
ProviderManager providerManager = ProviderManager.createManager(defaultHttpProvider);

2. Build service

Create different services by specific provider manager, service will provide some function.

ContractService contractService = ServiceManager.getContractService(providerManager);
AccountService accountService = ServiceManager.getAccountService(providerManager);

3. Create account

Account can be used to sign transaction.

Account account = accountService.genAccount(Algo.SMRAW);

4. Build transaction

Transaction builder can create different transaction by different style of initialization.

// deploy
Transaction transaction = new Transaction.HVMBuilder(account.getAddress()).deploy("hvm-jar/hvmbasic-1.0.0-student.jar").build();
transaction.sign(account);

// invoke
Transaction transaction1 = new Transaction.HVMBuilder(account.getAddress()).invoke(receiptResponse.getContractAddress(), new StudentInvoke()).build();

5. Get response

Service will return a Request, user can use Request to get specific Response by interface.

ReceiptResponse receiptResponse = contractService.deploy(transaction).send().polling();

6. Decode result

Decode result to specific type.

Decoder.decodeHVM(receiptResponse1.getRet(), String.class);

Issue

If you have any suggestions or idea, please submit issue in this project!

Doc

If you want to know more about LiteSDK, you can read manual at here.

javasdk's People

Contributors

hafeidejiangyou avatar jiaohu avatar kaiktang avatar kikyo-ky-co avatar liuxiaomeig avatar taoyq1988 avatar terasum avatar zhengbaic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

javasdk's Issues

文档EVM的部署部分代码 类名写错

Transaction transaction = new Transaction.EVMBuilder(account.getAddress()).deploy(bin, abi, params).build();
// 如果要部署的合约无构造函数,则调用如下
// Transaction transaction = new Transaction.HVMBuilder(account.getAddress()).deploy(bin).build();
应该是EVMBuilder

调用合约报错“out of gas”

用免费试用版(合并版,参考的wiki:https://docs.hyperchain.cn/document/detail?type=1&id=58)的安装包搭建了4个节点区块链
在调用时间复杂度大概1e6的合约方法的时候,抛出了异常,信息如下:
Exception in thread "main" cn.hyperchain.sdk.exception.RequestException: Invoke contract failed: INVOKE_CONTRACT_FAILED:
Caused by: java/lang/RuntimeException:out of gas
at cn.hyperchain.sdk.request.Request.send(Request.java:139)
at cn.hyperchain.sdk.request.PollingRequest.send(PollingRequest.java:64)
at cn.hyperchain.sdk.response.PollingResponse.polling(PollingResponse.java:65)
请问如何解决?

调用合约lambda表达式写法报错

demo每次调用合约需要新写一个类,尝试lambda表达式写法,org.apache.bcel.util报找不到类错误

         //调用 注册
        //Transaction transaction1 = new Transaction.HVMBuilder(account.getAddress()).invoke(contractAddress, new InvokeStudentReg()).build();
        //使用lambda表达式,避免新写一个类
        BaseInvoke<String, IStudent> register = iStudent ->
                iStudent.registerStudent(Arrays.asList(new Student("id1", "name1", 20), new Student("id2", "name2", 20)));
        Transaction transaction1 = new Transaction.HVMBuilder(account.getAddress()).invoke(contractAddress, register).build();
        transaction1.sign(account);
        ReceiptResponse receiptResponse1 = contractService.invoke(transaction1).send().polling();
        String decodeHVM1 = Decoder.decodeHVM(receiptResponse1.getRet(), String.class);
        System.out.println("decode: " + decodeHVM1);
        System.out.println(receiptResponse1.getRet());

报错:

java.lang.RuntimeException: java.lang.ClassNotFoundException: TestStudent$$Lambda$9/18179709 not found.

	at cn.hyperchain.sdk.common.utils.Encoder.encodeInvokeBeanJava(Encoder.java:97)
	at cn.hyperchain.sdk.transaction.Transaction$HVMBuilder.invoke(Transaction.java:173)
	at TestStudent.invoke(TestStudent.java:62)

bugs

sdk1.0.3

1、TxService.getTransactionsCountByContractAddr返回的json不应该用TxResponse序列化

    @Override
    public Request<TxResponse> getTransactionsCountByContractAddr(String from, String to, String contractAddress, boolean txExtra, int... nodeIds) {
        TxRequest txRequest = new TxRequest(TX_PREFIX + "getTransactionsCountByContractAddr", providerManager, TxResponse.class, nodeIds);

        HashMap<String, Object> params = new HashMap<>();
        params.put("from", from);
        params.put("to", to);
        params.put("address", contractAddress);
        params.put("txExtra", txExtra);
        txRequest.addParams(params);

        return txRequest;
    }

2、TxService.getNextPageTransactions 执行栈溢出

    @Override
    public Request<TxResponse> getNextPageTransactions(BigInteger blkNumber, BigInteger txIndex, BigInteger minBlkNumber, BigInteger maxBlkNumber, BigInteger separated, BigInteger pageSize, boolean containCurrent, String address, int... nodeIds) {
        return getNextPageTransactions(blkNumber, txIndex, minBlkNumber, maxBlkNumber, separated, pageSize, containCurrent, address, nodeIds);
    }

3、NodeStateResponse.NodeState 无hostname字段,返回的json有该字段(hyperchain1.8版本)

hvm invokedirect方式payload解析数据丢失

image
(图片有点大,另外点开)
litesdk 1.0.3版本调用sbank合约 invokedirect方式payload编码解码问题,缺少第一个 String AAA的参数。
invokeBean的方式调用解析是正常的

注册队列问题

public static void main(String[] args) throws RequestException, IOException {
        HttpProvider httpProvider = new DefaultHttpProvider.Builder()
                .setUrl(nodeAddr)
                // .https(tlsca, tls_peer_cert, tls_peer_priv)
                .build();

        ProviderManager providerManager = ProviderManager.createManager(httpProvider);

        AccountService accountService = ServiceManager.getAccountService(providerManager);
        Account account = accountService.fromAccountJson(AccountUtil.getAccountFromJson());

        MQService mqService = ServiceManager.getMQService(providerManager);
        Request<MQResponse> request = mqService.informNormal(1);
        request.send();

        ArrayList<String> array = new ArrayList<String>();
        array.add("SignedMQBlock");
        array.add("MQLog");
        array.add("MQException");
        String qname = "node1queue";
        MQParam mqParam = new MQParam.Builder().  //队列订阅相关的参数
                msgTypes(array).     //表示要订阅的消息类型
                blockVerbose(false).
                queueName(qname).    //表示队列名称// MQlog事件订阅需要的参数
                logAddress(contractAddress).   //表示log事件需要匹配的合约地址
                logTopics(new String[]{"topicA"}). //表示log事件需要匹配的topic集合
                build();
        Request<MQResponse> mqResponseRequest = mqService.registerQueue(mqParam,1);
        MQResponse response = mqResponseRequest.send();

        // MQResponse response = mqService.registerQueue(account.getAddress(), qname, array, false, 1).send();
        List<String> queueNames = response.getQueueNames();
        for (int i = 0; i < queueNames.size(); i++) {
            System.out.println(queueNames.get(i));
        }
    }

注册队列时发生如下异常
Exception in thread "main" cn.hyperchain.sdk.exception.RequestException: Invalid params: []interface {}: types.RegisterMeta.RoutingKeys: []string: From: Topics: [][]common.Hash: []common.Hash: unmarshalerDecoder: common: unmarshalJSON failed: hash must be exactly 32 bytes, error found in #10 byte of ...|[["topicA"]],"from":|..., bigger context ...|ignature":"","isVerbose":false,"topics":[["topicA"]],"from":"","routingKeys":["SignedMQBlock","MQLog|... at cn.hyperchain.sdk.request.Request.send(Request.java:102) at cn.hyperchain.sdk.request.MQRequest.send(MQRequest.java:18) at Mq.main(Mq.java:52)

使用另一种注册方式

public static void main(String[] args) throws RequestException, IOException {
        HttpProvider httpProvider = new DefaultHttpProvider.Builder()
                .setUrl(nodeAddr)
                // .https(tlsca, tls_peer_cert, tls_peer_priv)
                .build();

        ProviderManager providerManager = ProviderManager.createManager(httpProvider);

        AccountService accountService = ServiceManager.getAccountService(providerManager);
        Account account = accountService.fromAccountJson(AccountUtil.getAccountFromJson());

        MQService mqService = ServiceManager.getMQService(providerManager);
        Request<MQResponse> request = mqService.informNormal(1);
        request.send();

        ArrayList<String> array = new ArrayList<String>();
        array.add("SignedMQBlock");
        array.add("MQLog");
        array.add("MQException");
        String qname = "node1queue";
        // MQParam mqParam = new MQParam.Builder().  //队列订阅相关的参数
        //         msgTypes(array).     //表示要订阅的消息类型
        //         blockVerbose(false).
        //         queueName(qname).    //表示队列名称// MQlog事件订阅需要的参数
        //         logAddress(contractAddress).   //表示log事件需要匹配的合约地址
        //         logTopics(new String[]{"topicA"}). //表示log事件需要匹配的topic集合
        //         build();
        // Request<MQResponse> mqResponseRequest = mqService.registerQueue(mqParam,1);
        // MQResponse response = mqResponseRequest.send();

        MQResponse response = mqService.registerQueue(account.getAddress(), qname, array, false, 1).send();
        List<String> queueNames = response.getQueueNames();
        for (int i = 0; i < queueNames.size(); i++) {
            System.out.println(queueNames.get(i));
        }
    }

错误如下
Exception in thread "main" cn.hyperchain.sdk.exception.RequestException: register queue with singed option but ERCert is closed at cn.hyperchain.sdk.request.Request.send(Request.java:102) at cn.hyperchain.sdk.request.MQRequest.send(MQRequest.java:18) at Mq.main(Mq.java:51)

请问是少了什么参数吗

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.