更新时间:2022-09-16 GMT+08:00
链代码示例
如下是一个读写数据的链代码示例,您也可以参考Fabric官方示例中其他链代码。
新建Java项目时,您可以选择新建maven或者gradle项目,以导入依赖包。本示例以gradle项目为例。
/* 导入此段代码到项目的build.gradle前,请删除或注释build.gradle中原有内容 */
buildscript {
repositories {
mavenLocal()
maven{ url "https://mirrors.huaweicloud.com/repository/maven/" }
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4' }
}
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'
sourceCompatibility = 1.8
// 依赖包所用的代码仓库,将从所选地址搜寻并下载依赖包
repositories {
mavenLocal()
maven{ url "https://mirrors.huaweicloud.com/repository/maven/" }
maven{ url "https://jitpack.io" }/* 若Json-Schema无法导入,可以尝试加入此库 */
}
// 引入代码所需的依赖包
dependencies {
compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '2.2.+'
testCompile group: 'junit', name: 'junit', version: '4.12' // testCompile表明仅在调测时使用此包
testCompile 'org.mockito:mockito-core:2.4.1'
}
shadowJar {
baseName = 'chaincode'
version = null
classifier = null
manifest {
// 需要与继承ChaincodeBase类接口的类路径保持一致
attributes 'Main-Class': 'org.hyperledger.fabric.example.SimpleChaincode'
}
}
// 以下为SimpleChaincode类内中的内容
package org.hyperledger.fabric.example;//根据链代码文件实际位置编写,一般由系统自动生成
// 引入必要的包,系统自动操作,只要在maven或gradle中配置即可
import java.util.List;
import com.google.protobuf.ByteString;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperledger.fabric.shim.ChaincodeBase;
import org.hyperledger.fabric.shim.ChaincodeStub;
import static java.nio.charset.StandardCharsets.UTF_8;
// SimpleChaincode example simple Chaincode implementation
public class SimpleChaincode extends ChaincodeBase {
private static Log logger = LogFactory.getLog(SimpleChaincode.class);
@Override
public Response init(ChaincodeStub stub) {
logger.info("Init");
return newSuccessResponse();
}
@Override
public Response invoke(ChaincodeStub stub) {
try {
logger.info("Invoke java simple chaincode");
String func = stub.getFunction();
List<String> params = stub.getParameters();
if (func.equals("insert")) {
return insert(stub, params);
}
if (func.equals("query")) {
return query(stub, params);
}
return newErrorResponse("Invalid invoke function name. Expecting one of: [\"insert\", \"query\"]");
} catch (Throwable e) {
return newErrorResponse(e);
}
}
// The Insert method implements the data storage function and stores the key-value on the chain
private Response insert(ChaincodeStub stub, List<String> args) {
if (args.size() != 2) {
return newErrorResponse("Incorrect number of arguments. Expecting 2");
}
String key = args.get(0);
String val = args.get(1);
stub.putState(key, ByteString.copyFrom(val, UTF_8).toByteArray());
return newSuccessResponse();
}
// The Query method implements the data query function by invoking the API to query the value of the key
// API to query the value corresponding to a key
private Response query(ChaincodeStub stub, List<String> args) {
if (args.size() != 1) {
return newErrorResponse("Incorrect number of arguments. Expecting name of the person to query");
}
String key = args.get(0);
// Get the value of key
String val = stub.getStringState(key);
if (val == null) {
String jsonResp = "{\"Error\":\"Null val for " + key + "\"}";
return newErrorResponse(jsonResp);
}
logger.info(String.format("Query Response:\nkey: %s, val: %s\n", key, val));
return newSuccessResponse(val, ByteString.copyFrom(val, UTF_8).toByteArray());
}
public static void main(String[] args) {
new SimpleChaincode().start(args);
}
}
父主题: Java语言链代码开发