neo blockchain book
  • NEOHOPE's Blockchain Book
  • 概述
    • 本书内容
    • 读者定位
    • 本书约定
    • 项目对比
    • 名词释义
  • 基本原理
    • 区块链
    • 智能合约
    • 交易所
    • 系统架构
  • 基础算法
    • 默克尔树
    • Bloom过滤器
    • 公钥私钥及椭圆曲线
  • 共识算法
    • 分布式系统
    • Paxos与Raft算法
    • 拜占庭容错算法
  • Bitcoin
    • 整体架构
    • 状态转换
    • 区块确认
    • 分叉处理
    • P2P
    • 脚本
    • 钱包
    • 使用
    • 编译(Ubuntu)
    • 私链搭建(Linux)
    • 私链搭建(Docker)
  • Ethereum
    • 整体架构
    • 状态转换
    • 区块确认
    • 使用
    • Remix IDE环境搭建(Ubuntu16)
    • 智能合约编写01
    • 智能合约编写02
    • 智能合约编写03
    • 智能合约编写04
    • 编译(MacOS)
    • 私链搭建
  • EOS
    • 整体架构
    • 使用
    • 智能合约使用(单机单节点单钱包)
    • 智能合约使用(单机单节点多钱包)
    • 编写简单的智能合约
    • 编写有数据存储的智能合约
    • 编译(Linux)
    • 私链搭建(单机多节点)
    • 私链搭建(多机多节点)
  • Fabric
    • 整体架构
    • 身份管理
    • 共识达成
    • 使用
    • 智能合约介绍
    • 智能合约使用01
    • 智能合约使用02
    • 编译(MacOS)
    • 私链搭建(Ubuntu)
    • 在私链中添加一个机构
  • Cosmos
    • 整体架构
    • Zone与Hub
    • 使用
  • IPFS
    • 整体架构
    • 使用
    • 编译(MacOS)
    • 私链搭建
  • 然后呢?
由 GitBook 提供支持
在本页
  • 合约文件sacc.go
  • 在宿主机下尝试进行编译
  • 开启开发环境
  • 在虚拟机内进行编译合约
  • 在虚拟机内部署并运行合约
  • 打包签名部署命令行
  • 打包时附带lib
  • 数据加密
  1. Fabric

智能合约使用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是支持合约数据加密的
#但官方文档上没有找到合适的例子
#待补充
上一页智能合约使用01下一页编译(MacOS)

最后更新于7年前