Skip to content

Latest commit

History

104 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

opb-sdk-java

opb-sdk-java (open alliance chain SDK java)

引入 opb-sdk-java

从maven中央仓库引入 (load from central maven)

https://mvnrepository.com/artifact/io.github.bianjieai

 <dependency>
<groupId>io.github.bianjieai</groupId>
<artifactId>opb-sdk</artifactId>
<version>${version}</version>
</dependency>

手动下载引入 (manual load)

从 Asset 页面下载jar包,并手动将jar包上传到私服

Key Manger管理

0 新生成一个助记词(如果已有 私钥/keystore/助记词 忽略此步骤)

KeyManagerkm = KeyManagerFactory.createDefault();
Stringmnemonic = km.add();
System.out.println("助记词:" + mnemonic);
System.out.println("地址:" + km.getCurrentKeyInfo().getAddress());

1 恢复私钥 (recover privKey)

1.1 从助记词恢复(recover from mnemonic)

Stringmnemonic="opera xxx ..."KeyManagerkm=KeyManagerFactory.createDefault();
km.recover(mnemonic);

1.2 从私钥(recover from privKey)

BigIntegerprivKey=newBigInteger("3c49175daf981965679bf88d2690e22144424e16c84e9d397ddb58b63603eeec",16);
KeyManagerkm=KeyManagerFactory.createKeyManger(AlgoEnum.SM2);
km.recover(privKey);

1.3 从keystore恢复(recover from keystore)

Stringkeystore="-----BEGIN TENDERMINT PRIVATE KEY-----\n"+
"salt: 183EF9B57DEF8EF8C3AD9D21DE672E1B\n"+
"type: sm2\n"+
"kdf: bcrypt\n"+
"\n"+
"cpreEPwi0X3yIdsAIf94fR6s8L1TnDAQd/r4ifID6GmQX5a+4ehMmnTp2JjDpUe5\n"+
"kpgRI7CzF0DjKpPLvY9V9ZSXJFN42LHWscxqQ1E=\n"+
"=nJvd\n"+
"-----END TENDERMINT PRIVATE KEY-----";
InputStreaminput=newByteArrayInputStream(keystore.getBytes(StandardCharsets.UTF_8));
KeyManagerkm=KeyManagerFactory.createDefault();
km.recover(input,"123456");

2 导出(export)

BigIntegerprivKey=newBigInteger("3c49175daf981965679bf88d2690e22144424e16c84e9d397ddb58b63603eeec",16);
KeyManagerkm=KeyManagerFactory.createDefault();
km.recover(privKey);
Stringkeystore=km.export("123456");
System.out.println(keystore);

怎样使用opb-sdk-java(How to use opb-sdk-java)

1-1 初始化OpbClient (连接测试网 connect testnet)

Stringmnemonic = "opera vivid pride shallow brick crew found resist decade neck expect apple chalk belt sick author know try tank detail tree impact hand best";
KeyManagerkm = KeyManagerFactory.createDefault();
km.recover(mnemonic);
// projectID: 填你的 projectIDStringnodeUri = "http://47.100.192.234:26657";
StringgrpcAddr = "47.100.192.234:9090";
StringchainId = "testing";
ClientConfigclientConfig = newClientConfig(nodeUri, grpcAddr, chainId);
OpbConfigopbConfig = null;
OpbClientclient = newOpbClient(clientConfig, opbConfig, km);
assertEquals("iaa1ytemz2xqq2s73ut3ys8mcd6zca2564a5lfhtm3", km.getCurrentKeyInfo().getAddress());

1-2 初始化OpbClient (连接开放联盟链 connect open alliance chain)

Stringmnemonic = "opera vivid pride shallow brick crew found resist decade neck expect apple chalk belt sick author know try tank detail tree impact hand best";
KeyManagerkm = KeyManagerFactory.createDefault();
km.recover(mnemonic);
// projectID: 填你的 projectIDStringnodeUri = "https://opbningxia.bsngate.com:18602/api/${projectID}/rpc";
StringgrpcAddr = "opbningxia.bsngate.com:18603";
StringchainId = "wenchangchain";
ClientConfigclientConfig = newClientConfig(nodeUri, grpcAddr, chainId);
OpbConfigopbConfig = newOpbConfig(${projectID}, ${projectKey}, km.getCurrentKeyInfo().getAddress()); // 如果没有 projectKey 传null// 开启 TLS 连接opbConfig.setRequireTransportSecurity(true);
OpbClientclient = newOpbClient(clientConfig, opbConfig, km);
assertEquals("iaa1ytemz2xqq2s73ut3ys8mcd6zca2564a5lfhtm3", km.getCurrentKeyInfo().getAddress());

2 构造 txBodyBz (construct txBodyBz)

// 该 client 类型:opbClientBaseClientbaseClient = client.getBaseClient();
TxEnginetxEngine = baseClient.getTxEngine();
// 以 editNft 交易为例构造 txBodyTx.MsgEditNFTmsg = Tx.MsgEditNFT
.newBuilder()
.setDenomId(denomID)
.setId(id)
.setName(name)
.setUri(uri)
.setData(data)
.setSender(baseClient.getCurrentAddr())
.build();
List<GeneratedMessageV3> msgs = Collections.singletonList(msg);
TxOuterClass.TxBodytxBody = txEngine.buildTxBody(msgs);
byte[] txBodyBz = txBody.toByteArray();

3 构造 authInfoBz (construct authInfoBz)

参见前一下小结,需要先构造 txBody (see previous of this content, construct txBody first)

TxOuterClass.TxBodytxBody = txEngine.buildTxBody(msgs);
TxOuterClass.Txtx = txEngine.signTx(txBody, baseTx, baseClient.queryAccount());
TxOuterClass.AuthInfoauthInfo = tx.getAuthInfo();
byte[] authInfoBz = authInfo.toByteArray();

4 签名 / 其它发送交易的方法 (sign / user other method to send tx)

// 使用 txEngine 签名交易TxOuterClass.Txtx = txEngine.signTx(txBody, baseTx, baseClient.queryAccount());
byte[] txBz = tx.toByteArray();
// 使用 rpcClient 将签名好的 txBz 直接发送到区块链RpcClientrpcClient = baseClient.getRpcClient();
ResultTxresultTx = rpcClient.broadcastTx(txBz, BroadcastMode.Commit);
// ---// 当然也可以自己使用 httpClient 进行发送,将 txBz 进行 base64 编码,并使用 jsonRpc 发送, 代码如下JsonRpcjsonRpc = JsonRpc.WrapTxBytes(txBytes, "broadcast_tx_commit");
Stringstr = httpUtils.post(rpcUri, JSON.toJSONString(jsonRpc)); // rpcUri: 链uri,第二个参数post 的body

离线HASH (offline hash calculate)

StringtxHash = client.getBaseClient().buildTxHash(msg, baseTx, account);

使用NFT模块(Use NftClient)

1. 新增一个denom(issue denom)

BaseTxbaseTx = newBaseTx(200000, newFee("200000", "uirita"), BroadcastMode.Commit);
StringdenomID = "denomid" + newRandom().nextInt(1000);
StringdenomName = "test_name" + newRandom().nextInt(1000);
Stringschema = "no shcema";
IssueDenomRequestreq = newIssueDenomRequest()
.setId(denomID)
.setName(denomName)
.setSchema(schema);
ResultTxresultTx = nftClient.issueDenom(req, baseTx);

2. 发行一个nft(mint nft)

BaseTxbaseTx = newBaseTx(200000, newFee("200000", "uirita"), BroadcastMode.Commit);
MintNFTRequestmintReq = newMintNFTRequest()
.setDenom(denomID)
.setId(nftID)
.setName(nftName)
.setUri(uri)
.setData(data)
.setRecipient(km.getAddr());
ResultTxresultTx = nftClient.mintNft(mintReq, baseTx);

3. 编辑/修改存在的nft(edit nft)

BaseTxbaseTx = newBaseTx(200000, newFee("200000", "uirita"), BroadcastMode.Commit);
StringnewName = "new_name";
StringnewUri = "http://xx.com";
StringnewData = "new_data";
EditNFTRequesteditReq = newEditNFTRequest()
.setDenom(denomID)
.setName(newName)
.setId(nftID)
.setUri(newUri)
.setData(newData);
ResultTxresultTx = nftClient.editNft(editReq, baseTx);

4. 销毁nft(burn nft)

BaseTxbaseTx = newBaseTx(200000, newFee("200000", "uirita"), BroadcastMode.Commit);
BurnNFTRequestburnNFTReq = newBurnNFTRequest()
.setDenom(denomID)
.setId(nftID);
ResultresultTx = nftClient.burnNft(burnNFTReq, baseTx);

5. 查询denom (query denom)

QueryDenomRespdenom = nftClient.queryDenom(denomID);
// next is findAllList<QueryDenomResp> denoms = nftClient.queryDenoms(null);

6. 通过owner查询 (query by owner)

QueryOwnerRespowner = nftClient.queryOwner(denomID, km.getAddr());

使用TIBC模块(Use TibcClient)

1. 发起NFT跨链交易(tibc-nft-transfer transfer)

BaseTxbaseTx = newBaseTx(200000, newFee("300000", "stake"), BroadcastMode.Commit);
Stringclass_ = "denom01";
Stringid = "nft26";
StringdestChainName = "iris-test1";
StringrelayerChainName = "";
Stringreceiver = "iaa14u80vaseg99lxej9cvlmfz96xe8mvv6p6g469p";
ResultTxresultTx = tibcClient.nftTransfer(class_, id, receiver, destChainName, relayerChainName, baseTx);

2. 查询NFT跨链交易的commitment(tibc packet packet-commitment)

BaseTxbaseTx = newBaseTx(200000, newFee("300000", "stake"), BroadcastMode.Commit);
StringdestChain = "iris-test1";
StringsourceChain = "iris-test2";
longsequence = 2;
QueryOuterClass.QueryPacketCommitmentResponsecommitment = tibcClient.packetCommitment(destChain, sourceChain, sequence);

使用授权模块 (Use PermClient)

1. 授予某个地址权限 (Assign role to specify address)

Perm.Rolerole = Perm.Role.BLACKLIST_ADMIN;
ResultTxresultTx = permClient.assignRoles(acc, Collections.singletonList(role), baseTx);
assertNotNull(resultTx.getResult().getHash());

2. 查询地址的当前权限 (Current role of input address)

List<Perm.Role> roles = permClient.queryRoles(acc);

3. 删除某个地址权限 (Assign role to specify address)

permClient.unAssignRoles(acc, Collections.singletonList(role), baseTx);

4. perm模块的其他查询和交易 (other query and tx in this module)

查看 permClient 下的方法 (see method in perClient.java)

单元测试 (Unit Test Demo)

MsgsDemo.java

NftDemo.java

ClientTest.java

ComGovContractTest.java

HttpUtilsTest.java

IdentityClientTest.java

IOUtilTest.java

KeyManagerTest.java

MsgsTest.java

NftTest.java

PermTest.java

RecordTest.java

TibcTest.java

WasmTest.java

About

Java SDK for IRITA OPB

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages