From 5c76080ca7704a6f05d37c186f91e14d3319b948 Mon Sep 17 00:00:00 2001 From: wangzhiyong69 Date: Thu, 28 Oct 2021 17:38:27 +0800 Subject: [PATCH] contract-samples add example method --- .gitignore | 2 + .../samples/contract/SampleContract.java | 55 +++++++ .../samples/contract/SampleContractImpl.java | 134 +++++++++++++++++- 3 files changed, 184 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 877ebae4..6871bdc2 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ docker-sdk-1.4.1.RELEASE.jar jdchain-gateway-1.4.1.RELEASE.zip jdchain-peer-1.4.1.RELEASE.zip deploy/docker/docker-demo/src/main/docker/zip +runtime +.run diff --git a/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java b/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java index 1493bd92..936f1680 100644 --- a/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java +++ b/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java @@ -9,6 +9,61 @@ import com.jd.blockchain.contract.ContractEvent; @Contract public interface SampleContract { + // a. 创建角色,并分配权限 + @ContractEvent(name = "createRoleAndPermissions") + void createRoleAndPermissions(String role, String ledgerPermissionSemicolonStr, String txPermissionSemicolonStr); + + // b. 注册用户 + @ContractEvent(name = "registerUserByPubKey") + void registerUserByPubKey(String pubkey); + + // c. 修改用户角色 + @ContractEvent(name = "modifyUserRole") + void modifyUserRole(String address, String role); + + // d. 修改用户状态 + @ContractEvent(name = "modifyUserState") + void modifyUserState(String userAddress, String state); + + // e. 注册数据账户 + //void registerDataAccount(String seed); + + // f. 修改数据账户角色及mode + @ContractEvent(name = "modifyDataAccountRoleAndMode") + void modifyDataAccountRoleAndMode(String dataAccountAddress, String role, String mode); + + // h. 数据账户赋值,更新值 + @ContractEvent(name = "dataAccountAddress") + void setKV(String dataAccountAddress, String key, String value, String version); + + // i. 注册事件账户 + // String registerEventAccount(String seed) + + // j. 修改事件账户角色及mode + @ContractEvent(name = "modifyEventAccountRoleAndMode") + void modifyEventAccountRoleAndMode(String eventAccountAddress, String role, String mode); + + // k. 发布事件 + @ContractEvent(name = "publishEventAccount") + void publishEventAccount(String eventAccountAddress, String eventName, String value, String sequence); + + // l. 合约中调用合约 + @ContractEvent(name = "invokeContract") + void invokeContract(String contractAddress, String method, String argDotStr); + + // m. 合约中部署合约 + @ContractEvent(name = "deployContract") + String deployContract(String pubkey, byte[] carBytes); + + // n. 修改合约角色及mode + @ContractEvent(name = "modifyContractRoleAndMode") + void modifyContractRoleAndMode(String contractAddress, String role, String mode); + + // o. 修改合约状态 + @ContractEvent(name = "modifyContractState") + void modifyContractState(String contractAddress, String state); + + /** * 设置KV * diff --git a/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java b/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java index 2eb46fdf..e28c054d 100644 --- a/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java +++ b/samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java @@ -2,14 +2,12 @@ package com.jdchain.samples.contract; import com.jd.blockchain.contract.ContractEventContext; import com.jd.blockchain.contract.EventProcessingAware; -import com.jd.blockchain.crypto.AsymmetricKeypair; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.CryptoAlgorithm; -import com.jd.blockchain.crypto.SignatureFunction; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.Event; -import com.jd.blockchain.ledger.TypedKVEntry; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.crypto.base.DefaultCryptoEncoding; +import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.transaction.SimpleSecurityOperationBuilder; import utils.Bytes; /** @@ -19,6 +17,8 @@ public class SampleContractImpl implements EventProcessingAware, SampleContract private ContractEventContext eventContext; + + @Override public void setKVWithVersion(String address, String key, String value, long version) { eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version); @@ -110,4 +110,124 @@ public class SampleContractImpl implements EventProcessingAware, SampleContract public void postEvent(ContractEventContext eventContext, Exception error) { } + + @Override + public void createRoleAndPermissions(String role, String ledgerPermissionSemicolonStr, String txPermissionSemicolonStr) { + + SimpleSecurityOperationBuilder.SimpleRoleConfigurer roleConfigurer = eventContext.getLedger().security().role(role); + + if(ledgerPermissionSemicolonStr != null){ + for(String perm : ledgerPermissionSemicolonStr.split(";")){ + LedgerPermission permission = LedgerPermission.valueOf(perm.trim().toUpperCase()); + roleConfigurer.enable(permission); + } + } + + if(txPermissionSemicolonStr != null){ + for(String perm : txPermissionSemicolonStr.split(";")){ + TransactionPermission permission = TransactionPermission.valueOf(perm.trim().toUpperCase()); + roleConfigurer.enable(permission); + } + } + + } + + @Override + public void registerUserByPubKey(String pubkey) { + PubKey pubKey = DefaultCryptoEncoding.createPubKey(ClassicAlgorithm.ED25519.code(), Bytes.fromBase58(pubkey).toBytes()); + BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); + eventContext.getLedger().users().register(identityData); + } + + @Override + public void modifyUserRole(String address, String role) { + eventContext.getLedger() + .security() + .authorziation(Bytes.fromBase58(address)) + .authorize(role); + + } + + @Override + public void modifyUserState(String userAddress, String state) { + AccountState accountState = AccountState.valueOf(state.trim().toUpperCase()); + eventContext.getLedger().user(userAddress) + .state(accountState); + } + + @Override + public void modifyDataAccountRoleAndMode(String dataAccountAddress, String role, String mode) { + eventContext.getLedger().dataAccount(dataAccountAddress) + .permission() + .role(role) + .mode(Integer.parseInt(mode)); + } + + @Override + public void setKV(String dataAccountAddress, String key, String value, String version) { + eventContext.getLedger().dataAccount(dataAccountAddress) + .setText(key, value, Integer.parseInt(version)); + } + + @Override + public void modifyEventAccountRoleAndMode(String eventAccountAddress, String role, String mode) { + eventContext.getLedger().eventAccount(eventAccountAddress) + .permission() + .role(role) + .mode(Integer.parseInt(mode)); + } + + @Override + public void publishEventAccount(String eventAccountAddress, String eventName, String value, String sequence) { + eventContext.getLedger().eventAccount(eventAccountAddress) + .publish(eventName, value, Integer.parseInt(sequence)); + } + + @Override + public void invokeContract(String contractAddress, String method, String argSemicolonStr) { + String[] args = argSemicolonStr.split(";"); + BytesValue[] bytesValues = new BytesValue[args.length]; + + for(int i = 0; i < args.length; i++){ + bytesValues[i] = TypedValue.fromText(args[i]); + } + + eventContext.getLedger() + .contract(contractAddress) + .invoke(method, new BytesValueList() { + @Override + public BytesValue[] getValues() { + return bytesValues; + } + }); + } + + @Override + public String deployContract(String pubkey, byte[] carBytes) { + + PubKey pubKey = KeyGenUtils.decodePubKey(pubkey); + + ContractCodeDeployOperation deployOperation = eventContext.getLedger().contracts() + .deploy(new BlockchainIdentityData(pubKey), carBytes); + + return deployOperation.getContractID().getAddress().toString(); + } + + @Override + public void modifyContractRoleAndMode(String contractAddress, String role, String mode) { + eventContext.getLedger().contract(contractAddress) + .permission() + .role(role) + .mode(Integer.parseInt(mode)); + } + + @Override + public void modifyContractState(String contractAddress, String state) { + AccountState accountState = AccountState.valueOf(state.trim().toUpperCase()); + eventContext.getLedger().contract(contractAddress) + .state(accountState); + } + + + }