pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>jdchainconsole</artifactId>
<version>1.0-SNAPSHOT</version>
<name>jdchainconsole</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<framework.version>1.5.0.RELEASE</framework.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>sdk-client</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>sdk-rpc</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>crypto-classic</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>crypto-sm</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>ledger-model</artifactId>
<version>${framework.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
ChainResponse.java
package org.example;
import com.jd.blockchain.ledger.TransactionResponse;
public class ChainResponse {
private TransactionResponse _response;
/*
交易结果信息
*/
public TransactionResponse getResponse(){
return _response;
}
public void setResponse(TransactionResponse response){
_response = response;
}
private String _address;
/*
新建的用户地址、数据帐户地址
*/
public String getAddress(){
return _address;
}
public void setAddress(String address){
_address = address;
}
private boolean _state;
/*
执行情况
*/
public boolean getState(){
return _state;
}
public void setState(boolean state){
_state = state;
}
}
ChainHelper
package org.example;
import com.jd.blockchain.crypto.*;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.sdk.BlockchainService;
import com.jd.blockchain.sdk.client.GatewayServiceFactory;
import utils.Bytes;
import utils.codec.Base58Utils;
import java.sql.Timestamp;
public class ChainHelper {
protected static HashDigest ledger;
protected static BlockchainService blockchainService;
protected static BlockchainKeypair adminKey;
// 7VeR8q2oLa5dBgcSKi8AZ8ojpyDcVPP3pnaa4BCC7Kom5xhC
// 177gjvw6ePEW5GhThsQFUNXwu16MkaPEh8TPiEXjmNMj25UJUycaaZCYQ8rkucmYTqrJQ6H
// 8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG
// j5tos1z5oFXagUdJUuYjjjYC3rXYWn2kiDs4F4qVGBLz4N
// "192.168.10.8"
// 10550
public static void Init(String pubStr, String privStr, String pwd, String ledgerHash, String gateway, int port){
// 初始配置交易签名用户信息
PubKey pubKey = KeyGenUtils.decodePubKey(pubStr);
PrivKey privKey = KeyGenUtils.decodePrivKey(privStr, pwd);
adminKey = new BlockchainKeypair(pubKey, privKey);
// 读取网关配置
blockchainService = GatewayServiceFactory.connect(gateway, port, false, adminKey).getBlockchainService();
ledger = Crypto.resolveAsHashDigest(Base58Utils.decode(ledgerHash));
}
public static void getTransactionByContentHash(HashDigest sampleHash) {
LedgerTransaction tx = blockchainService.getTransactionByContentHash(ledger, sampleHash);
}
public static TypedKVEntry getDataEntries(String dataAccountString, String key) {
TypedKVEntry[] kvs = blockchainService.getDataEntries(ledger, dataAccountString, key);
return kvs[0];
}
// 数据上链
public static ChainResponse setKV(String dataAccountString,String key, String value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
System.out.println("上一版本:" + originalKV.getVersion());
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setText(key, value, version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
数据上链
*/
public static ChainResponse setKV(String dataAccountString,String key, Integer value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setInt64(key, value, version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
数据上链
*/
public static ChainResponse setKV(String dataAccountString,String key, Timestamp value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setTimestamp(key, value.getTime(), version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
数据上链
*/
public static ChainResponse setJSONKV(String dataAccountString,String key, String value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setJSON(key, value, version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
数据上链
*/
public static ChainResponse setByteKV(String dataAccountString,String key, Integer value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setBytes(key, Bytes.fromInt(value), version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
数据上链
*/
public static ChainResponse setByteKV(String dataAccountString,String key, byte[] value) {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 版本判断
TypedKVEntry originalKV = getDataEntries(dataAccountString, key);
long version = -1;
if(originalKV.getVersion()>-1){
version = originalKV.getVersion();
}
// 请正确填写数据账户地址
// expVersion是针对此key的插入更新操作次数严格递增,初始为-1,再次运行本测试用例请修改该值,否则服务端将报版本冲突异常。
txTemp.dataAccount(Bytes.fromBase58(dataAccountString)).setBytes(key, value, version);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
注册数据帐户
*/
public static ChainResponse registerDataAccount() {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 生成数据账户
BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate();
ret.setAddress(dataAccount.getAddress() + "");
System.out.println("数据账户地址:" + dataAccount.getAddress());
// 注册数据账户
txTemp.dataAccounts().register(dataAccount.getIdentity());
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
/*
注册用户并授权
*/
public static ChainResponse registerUserAndConfigRole() {
ChainResponse ret = new ChainResponse();
ret.setState(false);
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 生成用户
BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate();
ret.setAddress(user.getAddress().toString());
System.out.println("用户地址:" + user.getAddress());
// 注册用户
txTemp.users().register(user.getIdentity());
// 创建角色 MANAGER
txTemp.security().roles().configure("MANAGER")
.enable(LedgerPermission.WRITE_DATA_ACCOUNT)
.enable(TransactionPermission.DIRECT_OPERATION);
// 设置用户角色权限
txTemp.security().authorziations().forUser(user.getAddress()).authorize("MANAGER");
// 交易主恩贝
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
if (response.isSuccess()) {
ret.setState(true);
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
response.getBlockHeight(),
response.getContentHash(), response.getExecutionState().toString()));
}
ret.setResponse(response);
return ret;
}
public static boolean registerUser() {
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 生成用户
BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate();
System.out.println("用户地址:" + user.getAddress());
// 注册用户
txTemp.users().register(user.getIdentity());
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
return response.isSuccess();
}
public static void createRole() {
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 创建角色 MANAGER ,并设置可以写数据账户,能执行交易
txTemp.security().roles().configure("MANAGER")
.enable(LedgerPermission.WRITE_DATA_ACCOUNT)
.enable(TransactionPermission.DIRECT_OPERATION);
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
System.out.println("完成");
}
public static void configUserRole() {
// 新建交易
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
// 给用户设置 MANAGER 角色权限
txTemp.security().authorziations().forUser(Bytes.fromBase58("LdeNv7JLbcQidY98y2QYXK1dGmi589zjFrf4v")).authorize("MANAGER");
// 交易准备
PreparedTransaction ptx = txTemp.prepare();
// 交易签名
ptx.sign(adminKey);
// 提交交易
TransactionResponse response = ptx.commit();
System.out.println("完成2");
}
}
ConsoleApp
package org.example;
import com.jd.blockchain.contract.ContractEventContext;
import com.jd.blockchain.contract.EventProcessingAware;
import com.jd.blockchain.contract.LedgerContext;
import com.jd.blockchain.crypto.*;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.sdk.BlockchainService;
import com.jd.blockchain.sdk.client.GatewayServiceFactory;
import utils.Bytes;
import utils.codec.Base58Utils;
/**
* Hello world!
*
*/
public class App
{
// 账本Hash
protected static HashDigest ledger;
protected static BlockchainService blockchainService;
protected static BlockchainKeypair adminKey;
public static void main( String[] args )
{
String pubStr = "7VeR8q2oLa5dBgcSKi8AZ8ojpyDcVPP3pnaa4BCC7Kom5xhC";
String privStr = "177gjvw6ePEW5GhThsQFUNXwu16MkaPEh8TPiEXjmNMj25UJUycaaZCYQ8rkucmYTqrJQ6H";
String pwd = "8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG";
String ledgerAddr = "j5tos1z5oFXagUdJUuYjjjYC3rXYWn2kiDs4F4qVGBLz4N";
String gateway = "192.168.10.8";
Integer port = 10550;
ChainHelper.Init(pubStr,privStr,pwd,ledgerAddr,gateway,port);
String dataAccount = "LdeNve1fHLWCfRCm9J77pbWGDnR56xskKT3Mz";
//ChainHelper.getDataEntries("LdeNve1fHLWCfRCm9J77pbWGDnR56xskKT3Mz","key4");
ChainResponse ret = ChainHelper.setKV(dataAccount, "CorpName","xx有限公司");
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
ret.getResponse().getBlockHeight(),
ret.getResponse().getContentHash(), ret.getResponse().getExecutionState().toString()));
}
}