[TOC]
#JD区块链 0.5.0-SNAPSHOT
------------------------------------------------------------------------
### 版本修订历史
| 属性 |
名称 |
说明 |
| Address |
地址 |
账户的唯一标识 |
| RegNumber |
注册号 |
账户被注册到区块链的区块高度; |
| TxSquenceNumber |
交易序列号 |
由账户发起的交易的序列号,初始为 0,账户每发起一个交易则增加1; |
| ModelVersion |
账户模型版本 |
表示构成一个账户结构的属性模型的程序版本号; |
| Version |
账户版本 |
初始为 0,对账户的每一次变更(包括对权限设置、状态和合约代码的变更)都会使账户状态版本增加 1 ; 注:交易序号的改变不会导致账户版本的增加; |
| PrivilegeHash |
权限 hash |
权限树的根hash; |
| PrivilegeVersion |
权限版本 |
初始为 0, 每次对权限的变更都导致版本号加 1; |
| StateType |
状态类型 |
账户的状态类型有3种:空类型(NIL);键值类型;对象类型; |
| StateVersion |
状态版本 |
账户的状态类型有3种:空类型(NIL);键值类型;对象类型; |
| StateHash |
状态哈希 |
数据状态的 merkle tree 的根hash; |
| CodeHash |
合约代码哈希 |
由“账户地址+合约代码版本号+合约代码内容”生成的哈希; |
| CodeVersion |
代码版本 |
初始为 0,每次对代码的变更都使版本加 1 ; |
## 五、编程接口
### 1. 服务连接
// 区块链共识域;
String realm = "SUPPLY_CHAIN_ALLIANCE";
// 节点地址列表;
String[] peerIPs = { "192.168.10.10", "192.168.10.11", "192.168.10.12", "192.168.10.13" };
// 客户端的认证账户;
String clientAddress = "kkjsafieweqEkadsfaslkdslkae998232jojf==";
String privKey = "safefsd32q34vdsvs";
// 创建服务代理;
BlockchainService service = BlockchainServiceFactory.createServiceProxy(realm, peerIPs, clientAddress, privKey);
### 2. 账户注册
// 创建服务代理;
BlockchainService service = BlockchainServiceFactory.createServiceProxy(realm, peerIPs, clientAddress, privKey);
// 在本地定义注册账号的 TX;
String sponsorAddress = "kFGeafiafEeqEkadsfaslkdslkae99ds66jf==";
String sponsorPrivKey = "privKkjwlkejflkjdsfoiajfij329323==";
TransactionTemplate txTemp = service.newTransaction(sponsorAddress);
//--------------------------------------
// 区块链秘钥生成器;用于在客户端生成账户的公私钥和地址;
BlockchainKeyGenerator generator = BlockchainKeyGenerator.getInstance();
BlockchainKeyPair bcKey1 = generator.generate(KeyType.ED25519);
BlockchainKeyPair bcKey2 = generator.generate(KeyType.ED25519);
String exchangeContractScript = "function(){}";
// 注册账户;
txTemp.registerAccount()
.register(bcKey1, AccountStateType.MAP, exchangeContractScript)
.register(bcKey2, AccountStateType.OBJECT, null);
//--------------------------------------
// TX 准备就绪;
PreparedTransaction prepTx = txTemp.prepare();
// 使用私钥进行签名;
prepTx.sign(sponsorAddress, sponsorPrivKey);
// 提交交易;
prepTx.commit();
### 3. 权限设置
// 创建服务代理;
BlockchainService service = BlockchainServiceFactory.createServiceProxy(realm, peerIPs, clientAddress, privKey);
// 在本地定义注册账号的 TX;
String sponsorAddress = "kFGeafiafEeqEkadsfaslkdslkae99ds66jf==";
String sponsorPrivKey = "privKkjwlkejflkjdsfoiajfij329323==";
TransactionTemplate txTemp = service.newTransaction(sponsorAddress);
//--------------------------------------
// 配置账户的权限;
String walletAccount = "Kjfe8832hfa9jjjJJDkshrFjksjdlkfj93F==";
String user1 = "MMMEy902jkjjJJDkshreGeasdfassdfajjf==";
String user2 = "Kjfe8832hfa9jjjJJDkshrFjksjdlkfj93F==";
// 配置:
// “状态数据的写入权限”的阈值为 100;
// 需要 user1、user2 两个账户的联合签名才能写入;
// 当前账户仅用于表示一个业务钱包,禁止自身的写入权限,只能由业务角色的账户才能操作;
txTemp.configPrivilege(walletAccount)
.setThreshhold(PrivilegeType.STATE_WRITE, 100)
.enable(PrivilegeType.STATE_WRITE, user1, 50)
.enable(PrivilegeType.STATE_WRITE, user2, 50)
.disable(PrivilegeType.STATE_WRITE, walletAccount);
//--------------------------------------
// TX 准备就绪;
PreparedTransaction prepTx = txTemp.prepare();
// 使用私钥进行签名;
prepTx.sign(sponsorAddress, sponsorPrivKey);
// 提交交易;
prepTx.commit();
### 4. 写入数据
// 创建服务代理;
BlockchainService service = BlockchainServiceFactory.createServiceProxy(realm, peerIPs, clientAddress, privKey);
// 在本地定义注册账号的 TX;
String sponsorAddress = "kFGeafiafEeqEkadsfaslkdslkae99ds66jf==";
String sponsorPrivKey = "privKkjwlkejflkjdsfoiajfij329323==";
TransactionTemplate txTemp = service.newTransaction(sponsorAddress);
// --------------------------------------
// 将商品信息写入到指定的账户中;
// 对象将被序列化为 JSON 形式存储,并基于 JSON 结构建立查询索引;
String commodityDataAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf==";
Commodity commodity1 = new Commodity();
Commodity commodity2 = new Commodity();
txTemp.updateObjects(commodityDataAccount)
.insert(commodity1.getCode(), commodity1)
.update(commodity2.getCode(), commodity2, true);
// 在钱包账户以 KEY “RMB-ASSET” 表示一种数字资产,通过在一个 TX
// 对两个账户的同一个资产数值分别增加和减少,实现转账的功能;
String walletAccount1 = "MMMEy902jkjjJJDkshreGeasdfassdfajjf==";
String walletAccount2 = "Kjfe8832hfa9jjjJJDkshrFjksjdlkfj93F==";
txTemp.updateMap(walletAccount1).decreaseInt("RMB-ASSET", 1000);
txTemp.updateMap(walletAccount2).increaseInt("RMB-ASSET", 1000);
// --------------------------------------
// TX 准备就绪;
PreparedTransaction prepTx = txTemp.prepare();
String txHash = prepTx.getHash();
// 使用私钥进行签名;
prepTx.sign(sponsorAddress, sponsorPrivKey);
// 提交交易;
prepTx.commit();
### 5. 查询数据
// 创建服务代理;
BlockchainService service = BlockchainServiceFactory.createServiceProxy(realm, peerIPs, clientAddress, privKey);
// 查询区块信息;
// 区块高度;
long ledgerNumber = service.getLedgerNumber();
// 最新区块;
Block latestBlock = service.getBlock(ledgerNumber);
// 区块中的交易的数量;
int txCount = latestBlock.getTxCount();
// 获取交易列表;
Transaction[] txList = service.getTransactions(ledgerNumber, 0, 100);
// 根据交易的 hash 获得交易;注:客户端生成 PrepareTransaction 时得到交易hash;
String txHash = "iikjeqke98321rjoijsdfa";
Transaction tx = service.getTransaction(txHash);
// 获取数据;
String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf==";
Set