一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用Java SDK實現離線簽名

使用Java SDK實現離線簽名

2021-07-26 11:05比原鏈Bytom Java教程

這篇文章主要介紹了使用Java SDK實現離線簽名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

嚴格來說,tx-signer并不屬于sdk,它是bytomd中構建交易、對交易簽名兩大模塊的java實現版。因此,若想用tx-signer對交易進行離線簽名,需要由你在本地保管好自己的私鑰。

如果你的目的是完全脫離于bytomd全節點,可能需要自己做更多額外的工作。比如,在構建交易時,需要花費若干個utxo(unspent transaction output)作為交易的輸入,如果沒有全節點則需要自身來維護utxo。當使用tx-signer構建完成一筆交易并簽名后,若沒有全節點的幫助,也需要自己實現p2p網絡協議將交易廣播到其他節點。

本文不會對以上技術細節進行討論,而是利用bytomd全節點查詢可用的utxo構建交易,對交易進行簽名并序列化后,同樣使用bytomd提交交易。

準備工作

將maven依賴引入到你的項目中

獲取sdk源碼

?
1
git clone https://github.com/bytom/bytom-java-sdk.git

打包成jar包并安裝到本地的maven倉庫

?
1
$ mvn clean install -dskiptests

在項目的pom文件中添加依賴。其中,第一個依賴是bytomd api的封裝,可用于查詢可用的utxo以及提交交易;第二個依賴用于構建交易以及對交易進行離線簽名。
 

?
1
2
3
4
5
6
7
8
9
10
11
<dependency>
  <groupid>io.bytom</groupid>
  <artifactid>java-sdk</artifactid>
  <version>1.0.0</version>
</dependency>
 
<dependency>
  <groupid>io.bytom</groupid>
  <artifactid>tx-signer</artifactid>
  <version>1.0.0</version>
</dependency>

構建交易

普通交易

查詢可用的utxo

在本文中,以下將全部使用全節點來查詢可用的utxo,你也可以構建一套自己的utxo維護方案。

?
1
2
3
4
client client = client.generateclient();
unspentoutput.querybuilder builder = new unspentoutput.querybuilder();
builder.accountalias = "bytom";
list<unspentoutput> outputs = builder.list(client);

利用sdk只需要四行代碼就能查詢可用的utxo(sdk具體文檔詳見java-sdk documentation)。在querybuilder中可以指定是否為未確認的utxo(默認false),也可以通過from和count來進行分頁查詢(默認查詢所有)。
假設在當前賬戶下查詢得到這樣一個utxo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "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。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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全節點來提交交易:

?
1
2
3
hashmap<string, object> body = 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

?
1
2
3
asset.querybuilder builder = new asset.querybuilder();
builder.setid("7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14");
list<asset> assets = builder.list(client);

假設查詢得到的資產信息如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
      "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個棒棒雞資產:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 查詢得到一個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/bytom-java-sdk/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://segmentfault.com/a/1190000018674925

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲色图首页 | 夫妇交换小说全文阅读 | 视频一区国产精戏刘婷30 | 欧美二区三区 | 男女视频在线观看 | 青青网站 | 国产91精品在线播放 | 继的朋友无遮漫画免费观看73 | 好大好硬好湿好紧h | 手机在线免费观看日本推理片 | 双性np玩烂了np欲之国的太子 | 天天操精品视频 | 91精品国产高清久久久久久io | 成年性午夜免费视频网站不卡 | 色中文字幕 | 小鸟酱视频在线观看 | 免费看麻豆视频 | 91久久福利国产成人精品 | 福利一区二区在线观看 | 成年人视频在线 | 午夜亚洲视频 | 欧美高清在线精品一区 | 91四虎国自产在线播放线 | 二区三区在线观看 | 免费在线公开视频 | 日本护士handjob | 午夜福利电影网站鲁片大全 | 国色天香论坛社区在线视频 | 国产90后美女露脸在线观看 | 亚洲天堂视频在线观看 | 五月婷婷在线免费观看 | 成人欧美一区二区三区 | 欧美娇小性xxxx | 国产视频中文字幕 | 西西人体大胆77777视频 | 午夜免费无码福利视频麻豆 | 好爽好舒服视频 | 青青青视频蜜桃一区二区 | 我的妹妹最近有点怪免费播放 | zoo性欧美 | 国产永久免费爽视频在线 |