@@ -1,21 +1,16 @@ | |||||
package com.jd.blockchain.contract.jvm; | package com.jd.blockchain.contract.jvm; | ||||
import java.lang.annotation.Annotation; | |||||
import java.lang.reflect.Method; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.util.ReflectionUtils; | |||||
import com.jd.blockchain.contract.ContractEvent; | |||||
import com.jd.blockchain.contract.ContractEventContext; | import com.jd.blockchain.contract.ContractEventContext; | ||||
import com.jd.blockchain.contract.engine.ContractCode; | import com.jd.blockchain.contract.engine.ContractCode; | ||||
import com.jd.blockchain.runtime.Module; | import com.jd.blockchain.runtime.Module; | ||||
import com.jd.blockchain.transaction.ContractType; | import com.jd.blockchain.transaction.ContractType; | ||||
import com.jd.blockchain.utils.BaseConstant; | |||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.util.ReflectionUtils; | |||||
import org.springframework.util.SerializationUtils; | |||||
import java.lang.reflect.Method; | |||||
/** | /** | ||||
* contract code based jvm | * contract code based jvm | ||||
@@ -29,7 +24,7 @@ public class JavaContractCode implements ContractCode { | |||||
private long version; | private long version; | ||||
private ContractEventContext contractEventContext; | private ContractEventContext contractEventContext; | ||||
private ContractType contractType; | |||||
private ContractType contractType ; | |||||
public JavaContractCode(Bytes address, long version, Module codeModule) { | public JavaContractCode(Bytes address, long version, Module codeModule) { | ||||
this.address = address; | this.address = address; | ||||
@@ -53,9 +48,8 @@ public class JavaContractCode implements ContractCode { | |||||
codeModule.execute(new ContractExecution()); | codeModule.execute(new ContractExecution()); | ||||
} | } | ||||
private Object[] resolveArgs(byte[] args) { | |||||
// TODO Auto-generated method stub | |||||
return null; | |||||
private Object resolveArgs(byte[] args) { | |||||
return SerializationUtils.deserialize(args); | |||||
} | } | ||||
class ContractExecution implements Runnable { | class ContractExecution implements Runnable { | ||||
@@ -78,8 +72,8 @@ public class JavaContractCode implements ContractCode { | |||||
startTime = System.currentTimeMillis(); | startTime = System.currentTimeMillis(); | ||||
// 反序列化参数; | // 反序列化参数; | ||||
Method handleMethod = contractType.getHandleMethod(contractEventContext.getEvent()); | |||||
Object[] args = resolveArgs(contractEventContext.getArgs()); | |||||
Method handleMethod = ContractType.resolve(myClass).getHandleMethod(contractEventContext.getEvent()); | |||||
Object args = resolveArgs(contractEventContext.getArgs()); | |||||
ReflectionUtils.invokeMethod(handleMethod, contractMainClassObj, args); | ReflectionUtils.invokeMethod(handleMethod, contractMainClassObj, args); | ||||
@@ -1,20 +1,19 @@ | |||||
package com.jd.blockchain.transaction; | package com.jd.blockchain.transaction; | ||||
import com.jd.blockchain.contract.Contract; | |||||
import com.jd.blockchain.contract.ContractEvent; | |||||
import com.jd.blockchain.utils.BaseConstant; | |||||
import com.jd.blockchain.utils.Bytes; | |||||
import java.lang.annotation.Annotation; | import java.lang.annotation.Annotation; | ||||
import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
import java.lang.reflect.Proxy; | import java.lang.reflect.Proxy; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import com.jd.blockchain.contract.ContractEvent; | |||||
import com.jd.blockchain.contract.ContractException; | |||||
import com.jd.blockchain.utils.BaseConstant; | |||||
import com.jd.blockchain.utils.Bytes; | |||||
import org.apache.http.annotation.Contract; | |||||
public class ContractInvocationProxyBuilder { | public class ContractInvocationProxyBuilder { | ||||
private Map<Class<?>, ContractType> contractTypes; | |||||
private Map<Class<?>, ContractType> contractTypes = new HashMap<Class<?>, ContractType>(); | |||||
public <T> T create(String address, Class<T> contractIntf, ContractEventSendOperationBuilder contractEventBuilder) { | public <T> T create(String address, Class<T> contractIntf, ContractEventSendOperationBuilder contractEventBuilder) { | ||||
return create(Bytes.fromBase58(address), contractIntf, contractEventBuilder); | return create(Bytes.fromBase58(address), contractIntf, contractEventBuilder); | ||||
@@ -52,7 +51,9 @@ public class ContractInvocationProxyBuilder { | |||||
// TODO 检查返回值类型; | // TODO 检查返回值类型; | ||||
return ContractType.resolve(contractIntf); | |||||
ContractType contractType1 = ContractType.resolve(contractIntf); | |||||
contractTypes.put(contractIntf,contractType1); | |||||
return contractType1; | |||||
} | } | ||||
@@ -12,9 +12,9 @@ public class ContractType { | |||||
private String name; | private String name; | ||||
private SortedMap<String, Method> events; | |||||
private SortedMap<String, Method> events = Collections.synchronizedSortedMap(new TreeMap<>()); | |||||
private SortedMap<Method, String> handleMethods; | |||||
private Map<Method, String> handleMethods = new HashMap<>();; | |||||
/** | /** | ||||
* 返回声明的所有事件; | * 返回声明的所有事件; | ||||
@@ -25,20 +25,24 @@ public class SDKDemo_Contract { | |||||
public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519"); | public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519"); | ||||
public static void main(String[] args) { | |||||
demoContract(); | |||||
} | |||||
/** | /** | ||||
* 演示合约执行的过程; | * 演示合约执行的过程; | ||||
*/ | */ | ||||
public static void demoContract() { | public static void demoContract() { | ||||
// 账本地址; | // 账本地址; | ||||
String ledgerAddress = "6GgNS3YgtxvZDBMvHEoqDiNZvWdiJ3MMpvRS9kL4DYwr4"; | |||||
String ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7"; | |||||
// 节点地址列表; | // 节点地址列表; | ||||
// NetworkAddress[] peerAddrs = { new NetworkAddress("192.168.10.10", 8080), | // NetworkAddress[] peerAddrs = { new NetworkAddress("192.168.10.10", 8080), | ||||
// new NetworkAddress("192.168.10.11", 8080), new NetworkAddress("192.168.10.12", 8080), | // new NetworkAddress("192.168.10.11", 8080), new NetworkAddress("192.168.10.12", 8080), | ||||
// new NetworkAddress("192.168.10.13", 8080) }; | // new NetworkAddress("192.168.10.13", 8080) }; | ||||
// 创建服务代理; | // 创建服务代理; | ||||
final String GATEWAY_IP = "192.168.151.39"; | |||||
final int GATEWAY_PORT = 80; | |||||
final String GATEWAY_IP = "localhost"; | |||||
final int GATEWAY_PORT = 11000; | |||||
final boolean SECURE = false; | final boolean SECURE = false; | ||||
GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, | GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, | ||||
CLIENT_CERT); | CLIENT_CERT); | ||||
@@ -52,13 +56,13 @@ public class SDKDemo_Contract { | |||||
// 一个贸易账户,贸易结算后的利润将通过一个合约账户来执行利润分配; | // 一个贸易账户,贸易结算后的利润将通过一个合约账户来执行利润分配; | ||||
// 合约账户被设置为通用的账户,不具备对贸易结算账户的直接权限; | // 合约账户被设置为通用的账户,不具备对贸易结算账户的直接权限; | ||||
// 只有当前交易发起人具备对贸易账户的直接权限,当交易发起人对交易进行签名之后,权限被间接传递给合约账户; | // 只有当前交易发起人具备对贸易账户的直接权限,当交易发起人对交易进行签名之后,权限被间接传递给合约账户; | ||||
String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; | |||||
String commerceAccount = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; | |||||
// 处理利润分成的通用业务逻辑的合约账户; | // 处理利润分成的通用业务逻辑的合约账户; | ||||
String profitDistributionContract = "AAdfe4346fHhefe34fwf343kaeER4678RT=="; | |||||
String profitDistributionContract = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; | |||||
// 收益人账户; | // 收益人账户; | ||||
String receiptorAccount1 = "MMMEy902jkjjJJDkshreGeasdfassdfajjf=="; | |||||
String receiptorAccount2 = "Kjfe8832hfa9jjjJJDkshrFjksjdlkfj93F=="; | |||||
String receiptorAccount1 = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; | |||||
String receiptorAccount2 = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; | |||||
// 资产编码; | // 资产编码; | ||||
String assetKey = "RMB-ASSET"; | String assetKey = "RMB-ASSET"; | ||||
// 此次待分配利润; | // 此次待分配利润; | ||||
@@ -22,7 +22,7 @@ public class BaseConstant { | |||||
public static final String SYS_CONTRACT_PROPS_NAME = "sys-contract.properties"; | public static final String SYS_CONTRACT_PROPS_NAME = "sys-contract.properties"; | ||||
public static final String CONTRACT_MAIN_CLASS_KEY = "contract"; | public static final String CONTRACT_MAIN_CLASS_KEY = "contract"; | ||||
public static final String CONTRACT_EVENT_PREFIX="@com.jd.blockchain.contract.model.ContractEvent(name="; | |||||
public static final String CONTRACT_EVENT_PREFIX="@com.jd.blockchain.contract.ContractEvent(name="; | |||||
// 编译时引用包黑名单 | // 编译时引用包黑名单 | ||||
public static final String PACKAGE_BLACKLIST = "BLACKLIST"; | public static final String PACKAGE_BLACKLIST = "BLACKLIST"; | ||||