智能合约使用02
合约文件sacc.go
//代码位置:
//fabric-samples/chaincode/sacc/sacc.go
//合约很简单就是kv储存、查询和更新的功能
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/peer"
)
type SimpleAsset struct {
}
// 部署及初始化时调用此函数
// 代码升级时也会调用此函数重置和迁移数据
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {
// Get the args from the transaction proposal
args := stub.GetStringArgs()
if len(args) != 2 {
return shim.Error("Incorrect arguments. Expecting a key and a value")
}
// Set up any variables or assets here by calling stub.PutState()
// We store the key and the value on the ledger
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0]))
}
return shim.Success(nil)
}
// 消息路由函数
// 调用 set 或 get方法
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
// Extract the function and args from the transaction proposal
fn, args := stub.GetFunctionAndParameters()
var result string
var err error
if fn == "set" {
result, err = set(stub, args)
} else { // assume 'get' even if fn is nil
result, err = get(stub, args)
}
if err != nil {
return shim.Error(err.Error())
}
// Return the result as success payload
return shim.Success([]byte(result))
}
// Set
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return "", fmt.Errorf("Failed to set asset: %s", args[0])
}
return args[1], nil
}
// Get
func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {
if len(args) != 1 {
return "", fmt.Errorf("Incorrect arguments. Expecting a key")
}
value, err := stub.GetState(args[0])
if err != nil {
return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err)
}
if value == nil {
return "", fmt.Errorf("Asset not found: %s", args[0])
}
return string(value), nil
}
// main function starts up the chaincode in the container during instantiate
func main() {
if err := shim.Start(new(SimpleAsset)); err != nil {
fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
}
}
在宿主机下尝试进行编译
cd fabric-samples/chaincode/sacc/
go build
开启开发环境
cd fabric-samples/chaincode-docker-devmode
#打开一个ssh
sudo docker-compose -f docker-compose-simple.yaml up
在虚拟机内进行编译合约
sudo docker exec -it chaincode bash
#在docker中运行
cd sacc
go build
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
在虚拟机内部署并运行合约
sudo docker exec -it cli bash
#在docker中运行
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
打包签名部署命令行
#打包
#-n合约名
#-p路径
#-v版本
#-s签名
#-S多重签名
#-i初始化策略
peer chaincode package -n 名称 -p 路径 -v 0 -s -S -i "AND('OrgA.admin')" 打包名
#签名
peer chaincode signpackage 打包名 签名后的打包名
#部署
#-n合约名
#-v版本
#-p路径
peer chaincode install -n 名称 -v 1.0 -p 路径
#初始化
#-n合约名
#-v版本
#-c初始化参数
#-P策略
peer chaincode instantiate -n 名称 -v 1.0 -c '{"Args":["john","0"]}' -P "OR ('Org1.member','Org2.member')"
#部署0版本
peer chaincode install -n 名称 -v 0 -p 路径
#初始化0版本
peer chaincode instantiate -n 名称 -v 0 -c '{"Args":["a", "b", "c"]}' -C channel名称
#部署1版本
peer chaincode install -n 名称 -v 1 -p 路径
#升级为1版本
peer chaincode upgrade -n 名称 -v 1 -c '{"Args":["d", "e", "f"]}' -C channel名称
#查询
peer chaincode query -C channel名称 -n 名称 -c '{"Args":["query","e"]}'
#调用
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C channel名称 -n 名称 -c '{"Args":["invoke","a","b","10"]}'
打包时附带lib
#初始化
govendor init
#增加全部外部包
govendor add +external
#增加某个包
govendor add packagepath
#然后再编译、打包就好了
数据加密
#fabric是支持合约数据加密的
#但官方文档上没有找到合适的例子
#待补充
最后更新于