A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuqiong 金牌黑马   /  2018-7-26 11:02  /  1413 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

星云链neb.java调用智能合约,因为官方例子中只有AccountExample,和TransactionExample,只有rpc的调用方式,如果想使用http的方式调用合约,官方的单元测试用例中可以进行参考,基于官方单元测试中例子太少,自己尝试了http调用方式,留下走过的坑。

1.调用合约的方法,不需要数据挂载到链上,只是http方式调用方法获取结果。

官方单元测试用例中testCall

Response<CallResult> response =
                nebulasClient.call(new CallRequest("n1Z6SbjLuAEXfhX1UJvXT6BB5osWYxVg3F3", "n1mL2WCZyRi1oELEugfCZoNAW3dt8QpHtJw", "0", 3l, "1000000", "2000000", new Contract().setFunction("transferValue").setArgs("[500]")));
        System.out.println(response.getResult().getResult());
        System.out.println(response.getResult().getEstimateGas());

传入自己地址,合约地址,配置参数,设置调用方法和方法参数,可以直接执行合约方法,获得结果,但是这种是无法往链上保持数据的,可以获取当前合约的各种状态。

2.调用合约,数据挂载到链上。

官方单元测试用例中调用方式。testSendRawTransaction

Response<RawTransaction> response = nebulasClient.sendRawTransaction(new SendRawTransactionRequest().setData("CiCrHtxyyIJks2/RErvBBA862D6iwAaGQ9OK1NisSGAuTBIYGiY1R9Fnx0z0uPkWbPokTeBIHFFKRaosGhgzPLPtjEF5cYRTgu3jz2egqWJwwF/i9wAiEAAAAAAAAAAADeC2s6dkAAAoAjDd/5jSBToICgZiaW5hcnlAZEoQAAAAAAAAAAAAAAAAAA9CQFIQAAAAAAAAAAAAAAAAAABOIFgBYkGLnnvGZEDSlocc202ZRWtUlbl2RHfGNdBY5eajFiHKThfgXIwGixh17LpnZGnYHlmfiGe2zqnFHdj7G8b2XIP2AQ=="));
        System.out.println(response);

其中setData中的数据是签名后的数据,签名时,需要使用AccountManager进行签名,签名方式AccountManager.signTransaction()方法进行,当然,AccountManager需要钱配置好自己的密码,和key文件。配置方式AccountManager.load(keydata.getBytes(), passphrase.getBytes());配置好之后,就可以进行签名,签名的对象Transaction,Transaction自己可以进行创建new Transaction(chainID, from, to, BigInteger.valueOf(0), response.getResult().getNonce()+1, PayloadType.CALL, payload, BigInteger.valueOf(1000000), BigInteger.valueOf(2000000));

其中的payload中放置自己调用合约的方法和参数byte[] payload = new TransactionCallPayload("方法", "[参数]").toBytes();

然后就可以通过AccountManager.signTransaction(Transaction,“密码”);进行签名

然后通过byte[] txdata = Transaction.toProto();获取签名后数据然后进行base64,ByteUtils.Base64ToString(txdata ),base64后,获取的数据就可以使用nebulasClient.sendRawTransaction的方式进行调用合约,允许通过合约存储数据到链上。

如果有错误,欢迎指正。


4 个回复

倒序浏览
回复 使用道具 举报
奈斯,很赞
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马