Browse Source

contract-samples add example method

tags/1.6.0
wangzhiyong69 2 years ago
parent
commit
5c76080ca7
3 changed files with 184 additions and 7 deletions
  1. +2
    -0
      .gitignore
  2. +55
    -0
      samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java
  3. +127
    -7
      samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java

+ 2
- 0
.gitignore View File

@@ -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

+ 55
- 0
samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContract.java View File

@@ -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
*


+ 127
- 7
samples/contract-samples/src/main/java/com/jdchain/samples/contract/SampleContractImpl.java View File

@@ -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);
}



}

Loading…
Cancel
Save