1. 程式人生 > >星雲鏈neb.java呼叫智慧合約

星雲鏈neb.java呼叫智慧合約

星雲鏈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的方式進行呼叫合約,允許通過合約儲存資料到鏈上。

如果有錯誤,歡迎指正。