星云链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的方式进行调用合约,允许通过合约存储数据到链上。 如果有错误,欢迎指正。
|