时间:2019.12.15.23.05
1、前提条件
根据Fabric学习(一)之搭建第一个Fabric网络搭建好第一个网络之后,即 ./byfn.sh up
执行完成并成功搭建起网络
2、安装升级链码
2.1 示例 java 链码
import io.netty.handler.ssl.OpenSsl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperledger.fabric.protos.peer.ChaincodeShim;
import org.hyperledger.fabric.shim.ChaincodeBase;
import org.hyperledger.fabric.shim.ChaincodeStub;
import org.hyperledger.fabric.shim.ledger.KeyModification;
import org.hyperledger.fabric.shim.ledger.KeyValue;
import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;
import org.hyperledger.fabric.shim.ledger.QueryResultsIteratorWithMetadata;
public class BCGISChaincode extends ChaincodeBase {
private static Log _logger = LogFactory.getLog(BCGISChaincode.class);
public static void main(String[] args) {
System.out.println("OpenSSL avaliable: " + OpenSsl.isAvailable());
new BCGISChaincode().start(args);
}
@Override
public Response init(ChaincodeStub stub) {
return newSuccessResponse();
}
@Override
public Response invoke(ChaincodeStub stub) {
try {
_logger.info("Invoke java BCGIS chaincode");
String func = stub.getFunction();
List<String> params = stub.getParameters();
List<byte[]> paramsByte = stub.getArgs();
if (func.equals("PutRecord")) {
return putRecord(stub, params);
}
if (func.equals("GetRecordByKey")) {
return getRecordByKey(stub, params);
}
} catch (Throwable e) {
return newErrorResponse(e);
}
}
private Response putRecord(ChaincodeStub stub, List<String> args){
int argsNeeded = 2;
if (args.size() != argsNeeded){
return newErrorResponse("Incorrect number of arguments.Got" + args.size() + ", Expecting " + argsNeeded);
}
String key = args.get(0);
String value = args.get(1);
stub.putStringState(key, value);
return newSuccessResponse("Invoke finished successfully." );
}
private Response getRecordByKey(ChaincodeStub stub, List<String> args) {
int argsNeeded = 1;
if (args.size() != argsNeeded){
return newErrorResponse("Incorrect number of arguments.Got" + args.size() + ", Expecting " + argsNeeded);
}
String key = args.get(0);
byte[] tmpVal = stub.getState(key);
String message = "Query key->\"" + key + "\" successfully";
return newSuccessResponse(message, tmpVal);
}
}
2.2 安装升级链码
进入容器 将链码文件拷贝到容器中
$ docker exec -it cli bash
root@15ba21bec560:/opt/gopath/src/github.com/hyperledger/fabric/peer# // 15ba21bec560 为容器名
// 在容器外执行将连阿妈拷贝到容器中
$ docker cp FabricChaincode 15ba21bec560:/opt/gopath/src/github.com/hyperledger/fabric/peer
设置环境变量
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
$ CORE_PEER_ADDRESS=peer0.org1.example.com:7051
$ CORE_PEER_LOCALMSPID="Org1MSP"
$ CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
安装链码 ---->mycc 链码名
$ peer chaincode install -l java -n mycc -v 1.0 -p FabricChaincode/
2019-12-15 15:15:44.787 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-12-15 15:15:44.787 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-12-15 15:15:44.809 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
初始化链码(由于在启动时已经初始化过,这里直接跳过,升级链码即可)
$ peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 --tls true --cafile $ORDERER_TLSCA -c '{"Args": ["init"]}'
升级链码 ---->mychannel 通道名
$ peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 --tls true --cafile $ORDERER_TLSCA -c '{"Args":["init"]}'
2019-12-15 12:43:02.834 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-12-15 12:43:02.835 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
执行链码
$ peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc --tls true --cafile $ORDERER_TLSCA -c '{"Args":["PutRecord","testKey","testValue"]}'
2019-12-15 15:14:29.726 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 message:"Invoke finished successfully."
$ peer chaincode query -o orderer.example.com:7050 -C mychannel -n mycc --tls true --cafile $ORDERER_TLSCA -c '{"Args":["GetRecordByKey","testKey"]}'
testValue