摘要:當使用構建完成一筆交易并簽名后,若沒有全節點的幫助,也需要自己實現網絡協議將交易廣播到其他節點。其中,第一個依賴是的封裝,可用于查詢可用的以及提交交易第二個依賴用于構建交易以及對交易進行離線簽名。
嚴格來說,tx-signer并不屬于SDK,它是bytomd中構建交易、對交易簽名兩大模塊的java實現版。因此,若想用tx-signer對交易進行離線簽名,需要由你在本地保管好自己的私鑰。
如果你的目的是完全脫離于bytomd全節點,可能需要自己做更多額外的工作。比如,在構建交易時,需要花費若干個utxo(Unspent Transaction Output)作為交易的輸入,如果沒有全節點則需要自身來維護utxo。當使用tx-signer構建完成一筆交易并簽名后,若沒有全節點的幫助,也需要自己實現P2P網絡協議將交易廣播到其他節點。
本文不會對以上技術細節進行討論,而是利用bytomd全節點查詢可用的utxo構建交易,對交易進行簽名并序列化后,同樣使用bytomd提交交易。
準備工作 將Maven依賴引入到你的項目中獲取SDK源碼
git clone https://github.com/Bytom/bytom-java-sdk.git
打包成JAR包并安裝到本地的Maven倉庫
$ mvn clean install -DskipTests
在項目的POM文件中添加依賴。其中,第一個依賴是bytomd api的封裝,可用于查詢可用的utxo以及提交交易;第二個依賴用于構建交易以及對交易進行離線簽名。
構建交易 普通交易io.bytom java-sdk 1.0.0 io.bytom tx-signer 1.0.0
查詢可用的utxo
在本文中,以下將全部使用全節點來查詢可用的utxo,你也可以構建一套自己的utxo維護方案。
Client client = Client.generateClient(); UnspentOutput.QueryBuilder builder = new UnspentOutput.QueryBuilder(); builder.accountAlias = "bytom"; Listoutputs = builder.list(client);
利用SDK只需要四行代碼就能查詢可用的utxo(SDK具體文檔詳見java-sdk documentation)。在QueryBuilder中可以指定是否為未確認的utxo(默認false),也可以通過from和count來進行分頁查詢(默認查詢所有)。
假設在當前賬戶下查詢得到這樣一個utxo:
{ "account_alias": "bytom", "id": "ffdc59d0478277298de4afa458dfa7623c051a46b7a84939fb8227083411b156", "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "asset_alias": "BTM", "amount": 41250000000, "account_id": "0G1R52O1G0A02", "address": "sm1qxls6ajp6fejc0j5kp8jwt2nj3kmsqazfumrkrr", "control_program_index": 1, "program": "001437e1aec83a4e6587ca9609e4e5aa728db7007449", "source_id": "2d3a5d920833778cc7c65d7c96fe5f3c4a1a61aa086ee093f44a0522dd499a34", "source_pos": 0, "valid_height": 4767, "change": false, "derive_rule": 0 }
構建交易
現在需要往0014c832e1579b4f96dc12dcfff39e8fe69a62d3f516這個control program轉100個BTM。代碼如下:
String btmAssetID = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // 下面的字段與utxo中的字段一一對應 SpendInput input = new SpendInput(); input.setAssetId(btmAssetID); input.setAmount(41250000000L); input.setProgram("001437e1aec83a4e6587ca9609e4e5aa728db7007449"); input.setSourcePosition(0); input.setSourceID("2d3a5d920833778cc7c65d7c96fe5f3c4a1a61aa086ee093f44a0522dd499a34"); input.setChange(false); input.setControlProgramIndex(1); // 選擇使用BIP32還是BIP44來派生地址,默認BIP44 input.setBipProtocol(BIPProtocol.BIP44); // 賬戶對應的密鑰索引 input.setKeyIndex(1); // 自身本地保管的私鑰,用于對交易進行簽名 input.setRootPrivateKey("4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257"); Transaction tx = new Transaction.Builder() .addInput(input) // 加入需要轉入的output .addOutput(new Output(btmAssetID, 10000000000L, "0014c832e1579b4f96dc12dcfff39e8fe69a62d3f516")) // 剩余的BTM用于找零 .addOutput(new Output(btmAssetID, 31250000000L, "0014bb8a039726df1b649738e9973db14a4b4fd4becf")) .setTimeRange(0) .build(); String rawTransaction = tx.rawTransaction();
對交易調用build方法后,自動會對交易進行本地的驗證和簽名操作。注意,在本地只是做簡單的字段驗證,本地驗證通過并不代表交易合法。最后對交易調用rawTransaction方法返回交易序列化后的字符串。
提交交易
本文利用bytomd全節點來提交交易:
HashMapbody = new HashMap<>(); body.put("raw_transaction", "070100010160015e4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80c480c1240201160014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e6302401cb779288be890a28c5209036da1a27d9fe74a51c38e0a10db4817bcf4fd05f68580239eea7dcabf19f144c77bf13d3674b5139aa51a99ba58118386c190af0e20bcbe020b05e1b7d0825953d92bf47897be08cd7751a37adb95d6a2e5224f55ab02013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80b095e42001160014a82f02bc37bc5ed87d5f9fca02f8a6a7d89cdd5c000149ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80d293ad03012200200824e931fb806bd77fdcd291aad3bd0a4493443a4120062bd659e64a3e0bac6600"); Transaction.SubmitResponse response = client.request("submit-transaction", body, Transaction.SubmitResponse.class);
交易提交成功后,response返回交易ID。
發行資產交易查詢可用的utxo
發行資產時,需要使用BTM作為手續費,因此第一步同樣需要查詢當前賬戶下可用的utxo,由于上面已經提到,這里不再贅述。
查詢需要發行的資產信息
例如,需要發行的資產id為7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14
Asset.QueryBuilder builder = new Asset.QueryBuilder(); builder.setId("7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14"); Listassets = builder.list(client);
假設查詢得到的資產信息如下:
{ "type": "asset", "xpubs": [ "5ff7f79f0fd4eb9ccb17191b0a1ac9bed5b4a03320a06d2ff8170dd51f9ad9089c4038ec7280b5eb6745ef3d36284e67f5cf2ed2a0177d462d24abf53c0399ed" ], "quorum": 1, "key_index": 3, "derive_rule": 0, "id": "7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14", "alias": "棒棒雞", "vm_version": 1, "issue_program": "ae20db11f9dfa39c9e66421c530fe027218edd3d5b1cd98f24c826f4d9c0cd131a475151ad", "raw_definition_byte": "7b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d", "definition": { "decimals": 8, "description": {}, "name": "", "symbol": "" } }
構建交易
現在需要發行1000個棒棒雞資產:
IssuanceInput issuanceInput = new IssuanceInput(); issuanceInput.setAssetId("7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14"); issuanceInput.setAmount(100000000000L); // issue program issuanceInput.setProgram("ae20db11f9dfa39c9e66421c530fe027218edd3d5b1cd98f24c826f4d9c0cd131a475151ad"); // 可以不指定,不指定時將隨機生成一個 issuanceInput.setNonce("ac9d5a527f5ab00a"); issuanceInput.setKeyIndex(5); // raw definition byte issuanceInput.setRawAssetDefinition("7b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d"); // 該資產對應的私鑰 issuanceInput.setRootPrivateKey("4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257"); // 創建一個spend input作為手續費,假設當前有一個100BTM的utxo,并且使用1BTM作為手續費,則后續還要創建99BTM的找零地址 SpendInput feeInput = new SpendInput(btmAssetID, 10000000000L, "0014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e"); feeInput.setKeyIndex(1); feeInput.setChange(true); feeInput.setSourceID("4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adea"); feeInput.setSourcePosition(2); feeInput.setControlProgramIndex(457); feeInput.setRootPrivateKey("4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257"); Transaction tx = new Transaction.Builder() .addInput(issuanceInput) .addInput(feeInput) // 該output用于接收發行的資產 .addOutput(new Output("7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14", 100000000000L, "001437e1aec83a4e6587ca9609e4e5aa728db7007449")) // 找零 .addOutput(new Output(btmAssetID, 9800000000L, "00148be1104e04734e5edaba5eea2e85793896b77c56")) .setTimeRange(0) .build();
提交交易
提交交易的方式與普通交易一致。
銷毀資產交易銷毀資產跟發行資產類似,同樣需要BTM作為手續費。
查詢可用的utxo
查詢方式與普通交易一致。
構建交易
這里以銷毀一個BTM為例,假設查詢得到一個100BTM的utxo:
// 查詢得到一個100BTM的utxo作為輸入 SpendInput input = new SpendInput(btmAssetID, 10000000000L, "0014f1dc52048f439ac7fd74f8106a21da78f00de48f"); input.setRootPrivateKey(rootKey); input.setChange(true); input.setKeyIndex(1); input.setControlProgramIndex(41); input.setSourceID("0b2cff11d1d056d95237a5f2d06059e5395e86f60e69c1e8201ea624911c0c65"); input.setSourcePosition(0); // 銷毀資產時,可添加一段附加的文本 String arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"; // 銷毀99個BTM,剩余1個BTM作為手續費 Output output = Output.newRetireOutput(btmAssetID, 9900000000L, arbitrary); Transaction transaction = new Transaction.Builder() .addInput(input) .addOutput(output) .setTimeRange(2000000) .build(); String rawTransaction = transaction.rawTransaction();
提交交易
提交交易的方式與普通交易一致。
bytom java sdk:https://github.com/Bytom/byto...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24615.html
摘要:比原項目倉庫地址地址使用來構造對象參數單簽使用來構造對象參數多簽使用來構造對象參數多簽多輸入 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... tx_signer Java implementation of signing transaction offli...
摘要:比原項目倉庫地址地址使用來構造對象參數單簽使用來構造對象參數多簽使用來構造對象參數多簽多輸入 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... tx_signer Java implementation of signing transaction offli...
摘要:目錄可選的各平臺開發工具可選安卓開發者官網的一些離線文檔,不過下載下來打開也很慢,后面會提供另外一個離線版。可選,此項在高版本中已不提供,需要在里通過引入,當然也可以下載離線版內置的安卓示例程序,推薦安裝。可選安卓的源代碼,推薦安裝。 前言 HBuilder是DCloud(數字天堂)推出的一款支持HTML5的Web開發IDE。HBuilder的編寫用到了Java、C、Web和Ruby。...
閱讀 785·2021-08-23 09:46
閱讀 927·2019-08-30 15:44
閱讀 2585·2019-08-30 13:53
閱讀 3038·2019-08-29 12:48
閱讀 3846·2019-08-26 13:46
閱讀 1779·2019-08-26 13:36
閱讀 3510·2019-08-26 11:46
閱讀 1407·2019-08-26 10:48