当前位置: 迅达文档网 > 党团工作 >

开发指南:BUMO,存证,JAVA,开发指南x

| 来源:网友投稿

 开发指南:BUMO 存证 JAVA 开发指南 BUMO 存证 JAVA 开发指南 BUMO 开发概述 BUMO 是新一代商用级基础公链。通过创新的共识算法(BU Firework)、主链-子链多链结构(BU Orbits)、主链-主链跨链结构(BU Canal)、开发者友好的智能合约(BU CodeMach)等核心技术,构建泛在价值流通的互联网基础设施。为全球开发者提供完善的技术文档及开发工具,用以提高开发者的开发效率,更易于生态应用的接入。通过文档阅读及工具使用,使开发者们对 BUMO 技术架构及生态系统有更充分的理解。欢迎全球优秀开发者、行业专家和有影响力的意见领袖,加入BUMO 开发者生态,成为 BUMO 全球生态发展的基石力量。

 BUMO 是提供公共区块链基础设施服务,本文档帮助开发者如何接入 BUMO,并且提供基础服务,如在 BUMO 网络中进行创建区块链账户,发行数字资产,自由流通资产等操作。

 实例化 SDK 使用 SDK 前配置 SDK 基础配置,如设置 SDK 接入的节点 示例如下:

 String url = "http://seed1.bumotest.io:26002";

 SDK sdk = SDK.getInstance(url);

  测试链 URL:http://seed1.bumotest.io:26002

 主网 URL: 根据项目接入方自己搭建的主网节点信息而定

 创建账户 在 bumo 上创建一个账户,可通过开发工具包提供的创建账户函数 代码示例:

 public static AccountCreateResult createAccount() {

  AccountCreateResponse response = sdk.getAccountService().create();

  if (response.getErrorCode() != 0) {

  return null;

  }

  return response.getResult();

 }

 返回示例:

 AccountCreateResult

  // privateKey

  账户私钥

 // privbz8sQTNJfForacMJs1WX8M1YhSNq3YsztKNa4FWWwDyakwRv4Z3R

  // publicKey

  账户公钥 b0018a6b1111e89cfaf6b5149d5c74d65c94c8e4f5ecfe67a3bfa4f02fad3b9f51492b7dce98

  // address

  账户地址

 // buQk7a6MvSC2uYf42Tn5BcYSCh2c7oQ8e6wy

 注:

 注:

 该方式创建的账户处于未激活状态(未上链),在区块链上查不到。

 • 账户指一个用户、物品、机构、房子、文件、资产发行方账户等任何实体基于密码学算法的随机生成的一个数字身份,通常叫区块链账户(公私玥对及区块链账户地址),它不受任何中心化机构控制,完全由账户拥有者掌控。

 激活账户 未激活的账户需要链上账户(在 bumo 区块链网络中可以查询到的账户)对其激活。

 注:

 注:

 1 BU 是 bumo 链上内置代币,链上交易都需要消耗 BU 2 若小布口袋账户没有 BU,可以通过二级市场购买,然后提现至钱包账户上 3. 测试网络可以通过 https://faucet.bumotest.io/领取 BU 激活方法:

 1. 通过小布口袋(bumo 钱包)账户(钱包账户必须有可用余额的 BU)向待激活的账户转账至少大于 0.01BU,方可激活该未激活账户。

 2. 代码激活 代码示例:

 /**

  * Activate a new account

  */

 @Test

 public void activateAccount() {

 // The account private key to activate a new account

 String activatePrivateKey = "privbyQCRp7DLqKtRFCqKQJr81TurTqG6UKXMMtGAmPG3abcM9XHjWvq";

 Long initBalance = ToBaseUnit.BU2MO("1000");

 // The fixed write 1000L, the unit is MO

 Long gasPrice = 1000L;

 // Set up the maximum cost 0.01BU

 Long feeLimit = ToBaseUnit.BU2MO("0.01");

 // Transaction initiation account"s nonce + 1

 Long nonce = 8L;

  // Generate a new account to be activated

 Keypair keypair = Keypair.generator();

 System.out.println(JSON.toJSONString(keypair, true));

 String destAccount = keypair.getAddress();

  // 1. Get the account address to send this transaction

 String activateAddresss = getAddressByPrivateKey(activatePrivateKey);

  // 2. Build activateAccount

 AccountActivateOperation operation = new AccountActivateOperation();

 operation.setSourceAddress(activateAddresss);

 operation.setDestAddress(destAccount);

 operation.setInitBalance(initBalance);

 operation.setMetadata("activate account");

  String[] signerPrivateKeyArr = {activatePrivateKey};

 // Record txhash for subsequent confirmation of the real result of the transaction.

 // After recommending five blocks, call again through txhash `Get the transaction information

 // from the transaction Hash"(see example: getTxByHash ()) to confirm the final result of the transaction

 String txHash = submitTransaction(signerPrivateKeyArr, activateAddresss, operation, nonce, gasPrice, feeLimit);

 if (txHash != null) {

 System.out.println("hash: " + txHash);

 }

 }

  完整代码见:https://github.com/bumoproject/bumo-sdk-java/blob/master/examples/src/main/java/io/bumo/sdk/example/DigitalAssetsDemo.java

 记录存证信息 将存证信息记录在区块链上会被永久存储 获取账户的序列号 每个账户都维护着自己的序列号,该序列号从 1 开始,依次递增,一个序列号标志着一个该账户的交易 代码示例:

 public long getAccountNonce() {

  long nonce = 0;

  // Init request

  String accountAddress = [资方账户地址];

  AccountGetNonceRequest request = new AccountGetNonceRequest();

  request.setAddress(accountAddress);

 // Call getNonce

  AccountGetNonceResponse response = sdk.getAccountService().getNonce(request);

  if (0 == response.getErrorCode()) {

  nonce = response.getResult().getNonce();

  } else {

  System.out.println("error: " + response.getErrorDesc());

  }

  return nonce;

 }

 返回示例:

 nonce: 28

 组装存储存证信息操作 示例代码:

 /**

  * 组装存储存证信息交易操作

  * @param txOriginatorAddress 交易发起人账户地址

  * @param evidenceKey 存证 KEY

  * @param evidenceInfo 存证内容

  * @param txFee 区块链交易费用 单位 BU,注意:存储内容越多,相应需要的费用越多

  * @return

  */

 public AccountSetMetadataOperation buildStoreEvidence(String txOriginatorAddress,String evidenceKey,String evidenceInfo){

 //组装存证交易数据

 // 存证 Key,方便检索存证信息

 String key = evidenceKey;

 // 存证内容

 String value = evidenceInfo;

  AccountSetMetadataOperation operation = new AccountSetMetadataOperation();

 operation.setSourceAddress(txOriginatorAddress);

 operation.setKey(key);

 operation.setValue(value);

 return operation;

 }

 序列化交易 序列化交易以便网络传输 代码示例:

 public String seralizeTransaction(String txOriginatorAddress,

 BaseOperation[] operations,String txFee) {

 String transactionBlob = null;

  // 交易费用的单价(交易按字节收费,单位是 MO,1 BU = 10^8 MO)

 Long gasPrice = 1000L;

 // 交易费用(单位是 MO, 1 BU = 10^8 MO)

 Long feeLimit = ToBaseUnit.BU2MO(txFee);

 //1. 获取证书存储器账户 nonce

 Long txOriginatorNonce = getAccountNonce(txOriginatorAddress);

  // nonce 加 1 ,作为本次区块交易号

 txOriginatorNonce += 1;

  // Build transaction

 Blob

 TransactionBuildBlobRequest transactionBuildBlobRequest = new TransactionBuildBlobRequest();

 transactionBuildBlobRequest.setSourceAddress(senderAddresss);

 transactionBuildBlobRequest.setNonce(nonce);

 transactionBuildBlobRequest.setFeeLimit(feeLimit);

 transactionBuildBlobRequest.setGasPrice(gasPrice);

 for (int i = 0; i < operations.length; i++) {

  transactionBuildBlobRequest.addOperation(operations[i]);

 }

  TransactionBuildBlobResponse transactionBuildBlobResponse = sdk.getTransactionService().buildBlob(transactionBuildBlobRequest);

  if (transactionBuildBlobResponse.getErrorCode() == 0) {

 transactionBlob = transactionBuildBlobResponse. getResult().getTransactionBlob();

 } else {

  System.out.println("error: " + transactionBuildBlobResponse.getErrorDesc());

 }

 return transactionBlob;

 }

 // 注:

 // txFee: 本次交易的交易费用,存证内容越多,花费费用越多

 返回示例:

 transactionBlob:

 0A2462755173757248314D34726A4C6B666A7A6B7852394B584A366A537532723978424E4577101C18C0F1CED

  11220E8073A350802122462755173757248314D34726A4C6B666A7A6B7852394B584A366A537532723978424E

  45772A0B0A03474C41108094EBDC033AB6010804122462755173757248314D34726A4C6B666A7A6B7852394B5

  84A366A537532723978424E45773A8B010A1261737365745F70726F70657274795F474C4112757B22636F6465

  223A22474C41222C22746F74616C537570706C79223A313030303030303030302C22646563696D616C73223A3

  02C226E616D65223A22474C41222C2269636F6E223A22222C226465736372697074696F6E223A22474C412054

  4F4B454E222C2276657273696F6E223A22312E30227D

 签名交易 交易序列化后,交易发起人需要对交易数据进行身份确权(用私钥对数据进行签名),通常称为数据的签名。签名结果包括签名数据和公钥。

 代码示例:

 public Signature signTransaction(String transactionBlob,String accountPrivateKey) {

  Signature[] signatures = null;

  String senderPrivateKey = accountPrivateKey;

  // Sign transaction BLob

 TransactionSignRequest transactionSignRequest = new TransactionSignRequest();

 transactionSignRequest.setBlob(transactionBlob);

 transactionSignRequest.addPrivateKey(senderPrivateKey);

 TransactionSignResponse transactionSignResponse = sdk.getTransactionService().sign(transactionSignRequest);

 if (transactionSignResponse.getErrorCode() == 0) {

  signatures = transactionSignResponse.getResult().getSignatures();

 } else {

  System.out.println("error: " + transactionSignResponse.getErrorDesc());

 }

 return signatures[0];

 }

 返回示例:

 // 签名(signatures)

  // signData:

 签名串

 // 6CEA42B11253BD49E7F1A0A90EB16448C6BC35E8684588DAB8C5D77B5E771BD5C7E1718942B32F9BDE14551866C00FEBA832D92F88755226434413F98E5A990C;

  // publicKey: 账户公钥(交易发起人的账户公钥)

 // b00179b4adb1d3188aa1b98d6977a837bd4afdbb4813ac65472074fe3a491979bf256ba63895

 提交交易 交易数据签名后,需要将交易元数据(transactionBlob)及签名(signatures)提交(交易广播)给区块链网络 注:交易涉及多方(多个签名账户)时,提交交易时需要将多个签名一并提交给BUChain 网络 网络 代码示例:

 public String submitTransaction(String transactionBlob, Signature[] signatures) {

 String

 hash = null;

  // Submit transaction

 TransactionSubmitRequest transactionSubmitRequest = new TransactionSubmitRequest();

 transactionSubmitRequest.setTransactionBlob(transactionBlob);

 transactionSubmitRequest.setSignatures(signatures);

 TransactionSubmitResponse transactionSubmitResponse = sdk.getTransactionService().submit(transactionSubmitRequest);

 if (0 == transactionSubmitResponse.getErrorCode()) {

 hash = transactionSubmitResponse.getResult().getHash();

 } else {

 System.out.println("error: " + transactionSubmitResponse.getErrorDesc());

 }

 return

 hash ;

 }

 返回示例:

 // hash:

 交易哈希

 // 031fa9a7da6cf8777cdd55df782713d4d05e2465146a697832011b058c0a0cd8

 注:

 注:

 1. 交易涉及多方(多个签名账户)时,提交交易时需要将多个签名一并提交给BUChain 网络 2. 提交交易(广播交易)后一般 10 秒左右可以得到交易终态结果,开发者可以通过查询交易状态接口查询最终状态 查询交易状态 查询交易的最终状态可以通过本接口查询,通常交易提交后 10 秒后可以得到交易的终态结果 代码示例:

 public int checkTransactionStatus(String txHash) {

 // Init request

 TransactionGetInfoRequest request = new TransactionGetInfoRequest();

 request.setHash(txHash);

  // Call getInfo

 TransactionGetInfoResponse response = sdk.getTransactionService().getInfo(request);

 int errorCode = response.getErrorCode();

 if (errorCode == 0){

 TransactionHistory transactionHistory = response.getResult().getTransactions()[0];

 errorCode = transactionHistory.getErrorCode();

 }

  return errorCode;

  }

 返回值为:

 错误码 描述 0 Successful operation 1 Inner service defect 2 Parameters error 3 already exist, such as repeated transactions 4 Objects do not exist, such as null account, transactions and blocks etc. 5 Transactions expired. It means the transaction has been removed from the buffer, but it still has probability to be executed. 7 Math calculation is overflown 20 The expression returns false. It means the TX failed to bexecuted currently, but it still has probability to be executed in the following blocks . 21 The syntax of the expression returns are false. It means that the TX must fail.

 90 ublic key 91 private key 92 Invalid assets 93 The weight of the signature does not match the threshold of the operation. 94 Invalid address 97 Absent operation of TX 98 Over 100 operations in a single transaction 99 Invalid sequence or nonce of TX 0 Low reserve in the account 1 Sender and receiver accounts are the same 2 The target account already exists 3 Accounts do not exist 4 Low reserve in the account 5 Amount of assets exceeds the limitation ( int64 ) 106 Insufficient initial reserve for account creation 1 Low transaction fee 114 TX buffer is full 0 weight 121 threshold 4 Invalid data version of metadata 146 exceeds upper limitation 1 contract execution 2 Failure in syntax analysis 3 The depth of contract recursion exceeds upper limitation 4 the TX submitted from the contract exceeds upper limitation 155 Contract expired 160 Fail to insert the TX into buffer 60 BlockNumber must bigger than 0 117 Failed to connect to the network 121 Request parameter cannot be null 20000 System error

推荐访问:指南 开发 java

热门排行

党委党组落实全面从严治党主体责任规定指出本地区本单位发生重大违纪违法案件14篇

党委党组落实全面从严治党主体责任规定指出本地区本单位发生重大违纪违法案件14篇党委党组落实全面从严治党主体责任规定指出本地区本单位发生重大违纪违法案件篇1我

2022年五星支部创建实施方案5篇

2022年五星支部创建实施方案5篇2022年五星支部创建实施方案篇1为切实提高支部党建工作科学化水平、不断夯实党建基础,挖掘支部党建特色,创新支部党建工作做

七言绝句古诗精选【十首】

【 能力训练 导语】七言绝句是中国传统诗歌的一种体裁,简称七绝,属于近体诗范畴。此体全诗四句,每句七

2022年支部党员大会记录内容14篇

2022年支部党员大会记录内容14篇2022年支部党员大会记录内容篇120xx年度我校新党员发展工作已经开始。根据学校党委3月21日会议精神,今年新党员发展

统计工作如何为企业管理服务

作为企业管理重要组成部分的统计工作,在企业的经济运行中发挥着信息、咨询和监督三大作用,它为企业的经营

乡镇创建无毒社区工作方案

一、指导思想以“三个代表”重要思想为指导,认真贯彻落实上级精神,以禁吸戒毒为中心,全面落实禁毒工作责

四年级我家菜园日记500字

菜园子,就是种菜的地方。种菜的时候为了防止家禽进入菜地,于是农夫用篱笆或者栅栏将菜地围起来形成的一个

哈尔移动城堡电影观后有感范本

在观看完一部作品以后,相信你会有不少感想吧,这时我们很有必要写一篇观后感了。可能你现在毫无头绪吧,下

党支部2022年学习计划14篇

党支部2022年学习计划14篇党支部2022年学习计划篇1认真坚持“三会一课”制度,对于加强支部建设,提高党的战斗力、健全党的生活,严格党员管理,充分发挥党