实战:区块链hyperledger fabric 初体验 - 3: 链码实例安装、实例化、调用及代码

本文链码实例为Fabric 官方实例examples/chaincode/go/chaincode_example02,实现简单的转账功能

进入到cli容器里面


$ docker exec -it fabric-cli bash

1. 链码安装

以在org1, peer0 为例

1.1 设置环境变量

export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt

1.2 安装链码

# peer chaincode install -n test02 -v 1.0 -p examples/chaincode/go/chaincode_example02

修改相关环境变量和参数,重复步骤1.1 和1.2,在{org1, peer1},{org2, peer0},{org2, peer1}上安装链码

2.链码实例化

以下过程在任意一个节点执行一次就行。

peer chaincode instantiate \
-o orderer.example.com:7050 \
-C "businesschannel"  \
-n test02 \
-v 1.0 \
-c '{"Args":["init","a","100","b","200"]}' \
-P "OR    ('Org1MSP.member','Org2MSP.member')" \
--tls true \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.测试链码

3.1 查询初始值

# peer chaincode query -C "businesschannel" -n "exp02" -c '{"Args":["query","a"]}'

# peer chaincode query -C "businesschannel" -n "exp02" -c '{"Args":["query","b"]}'

3.2 转账:从"a" 的账户转账10到"b" 的账户

peer chaincode invoke \
-o orderer.example.com:7050 \
-C "businesschannel" \
-n "test02" \
-c '{"Args":["invoke","a","b","10"]}' \
--tls true \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.3 查询转账结果

# peer chaincode query -C "businesschannel" -n "test02" -c '{"Args":["query","a"]}'

查询另一个节点{org2,peer1} 的账本

export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.cr

结果一致。

4.代码解析

4.1 引入必要的包

import (
    "fmt"
    "strconv"

"github.com/hyperledger/fabric/core/chaincode/shim"
    pb "github.com/hyperledger/fabric/protos/peer"
)

"github.com/hyperledger/fabric/core/chaincode/shim":shim包提供了链码与账本交互的中间层。

4.2 初始化

func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {

......

//提取参数

_, args := stub.GetFunctionAndParameters()
    var A, B string    // Entities
    var Aval, Bval int // Asset holdings

......

// 初始化链码

A = args[0]
    Aval, err = strconv.Atoi(args[1])

......

 B = args[2]

Bval, err = strconv.Atoi(args[3])

......

// 把状态写入账本

err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
  ......
    err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
......
    return shim.Success(nil)
}

4.3 Inovke方法

获取function值

function, args := stub.GetFunctionAndParameters()

根据function值不同,执行不同的分支处理逻辑。

    if function == "invoke" {
        // Make payment of X units from A to B
        return t.invoke(stub, args)
    } else if function == "delete" {
        // Deletes an entity from its state
        return t.delete(stub, args)
    } else if function == "query" {
        // the old "Query" is now implemtned in invoke
        return t.query(stub, args)
    }

query分支


func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {

......

A = args[0]

// 从账本获得状态值

Avalbytes, err := stub.GetState(A)

......

}

invoke分支


func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {

......

//从账本获取"a"的值

Avalbytes, err := stub.GetState(A)

......

//从账本获取"b"的值

Bvalbytes, err := stub.GetState(B)

......

//执行转账

Aval = Aval - X
    Bval = Bval + X

......

//结果计入账本

err = stub.PutState(A, []byte(strconv.Itoa(Aval)))

......

err = stub.PutState(B, []byte(strconv.Itoa(Bval)))

......}

delete分支


func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {

......

//删除一个实体

err := stub.DelState(A)

}

原文地址:http://blog.51cto.com/yinweiai/2084324

时间: 2024-10-09 18:08:52

实战:区块链hyperledger fabric 初体验 - 3: 链码实例安装、实例化、调用及代码的相关文章

实战:区块链hyperledger fabric 初体验 - 2: 测试网络

1.make gen_config generate the crypto-config and channel-artifacts. $ hyperledger/docker-compose-files/hyperledger_fabric/v1.0.5 $ make gen_config 2.进入到cli容器里面 $ docker exec -it fabric-cli bash 3.Create Application Channel with default name of busine

香蕉派(or 皮?)上手初体验 -- 外观鉴赏,安装,配置&总结

一.前言及简介 听到"派"或者是看到这幅图片,难免让你想到目前大名鼎鼎的"树莓派".而香蕉派(Banana Pi, 论坛上也有人称它香蕉皮)是一款国产的比树莓派性能更好的单板.开源的开发板.它可以运行Android 4.4系统.Debian.Raspbian以及Lubuntu等操作系统.它采用比较火的全志A20 SoC,1G 内存,从硬件性能上来说它要比树莓派更佳,但是事实真的就是硬件的叠加这么简单么? 我有幸在云汉芯城论坛上申请到一块香蕉派,于是下面我们来看看这个

(转)Zookeeper 初体验之——伪分布式安装

Zookeeper 初体验之——伪分布式安装 简介 Apache Zookeeper 是由 Apache Hadoop 的 Zookeeper 子项目发展而来,现在已经成为了 Apache 的顶级项目.Zookeeper 为分布式系统提供了高效可靠且易于使用的协同服务,它可以为分布式应用提供相当多的服务,诸如统一命名服务,配置管理,状态同步和组服务等.Zookeeper 接口简单,开发人员不必过多地纠结在分布式系统编程难于处理的同步和一致性问题上,你可以使用 Zookeeper 提供的现成(of

KVM之初体验——手动及自动化安装KVM脚本

一,什么是KVM KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式.用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hypervisor)的代码.由于这是一个新的处理器执行模型,代 码不需要任何的改动.   除了处理器状态转换,这个内核模块同样处理很小一部分低层次的模拟,比如MMU注册(用于管理VM)和一部分PCI模拟的硬件. 在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专

Zookeeper 初体验之——伪分布式安装(转)

原文地址: http://blog.csdn.net/salonzhou/article/details/47401069 简介 Apache Zookeeper 是由 Apache Hadoop 的 Zookeeper 子项目发展而来,现在已经成为了 Apache 的顶级项目.Zookeeper 为分布式系统提供了高效可靠且易于使用的协同服务,它可以为分布式应用提供相当多的服务,诸如统一命名服务,配置管理,状态同步和组服务等.Zookeeper 接口简单,开发人员不必过多地纠结在分布式系统编程

kvm初体验之二:安装

Host: CentOS release 6.4 (Final) 1. 开启处理器的虚拟化功能 进入BIOS,使能虚拟化功能: 进入linux, grep -E "vmx|svm" /proc/cpuinfo 查看是否有输出 2. 安装rpm包 yum install kvm python-virtinst libvirt libvirt-python virt-manager \virt-viewer libguestfs-tools 3. 检查内核模块kvm和kvm_intel是否

Go语言与区块链——阶段性学习建议

2019年Go语言与区块链 链接: https://pan.baidu.com/s/1rtstZKws3t9L8bcFZmUd3Q 提取码: gx1r 阶段一:区块链主流语言:Go语言开发实战 本阶段需要掌握Linux和Windows双系统开发环境,建立面向对象思维,能对问题进行抽象归类.掌握基础的并发理论. 主要内容包括有:Go语言介绍及开发环境搭.基础类型.运算符.流程控制.函数.工程管理.复合类型.面向对象编程.异常处理.文本文件处理.案例:开发实战. 阶段二:区块链后端技术体系:Go语言

学习Hyperledger Fabric 实战联盟链

第1章 区块链技术基础本章介绍了区块链技术的相关基础技术要点,纯技术理论角度阐释区块链底层相关概念及所用技术 第2章 Hyperledger Fabric入门本章简单介绍了Hyperledger组织相关的区块链框架及工具,以及Fabric相关的项目介绍,并搭建了第一个Fabric区块链网络,让大家能够快速体验区块链的魅力 第3章 Hyperledger Fabric系统架构本章概括了Fabric的体系架构,包括服务组件,网络拓扑以及Fabric的典型交易流程,让大家对Fabric先有一个整体的概

区块链技术系列(3)- Fabric基础架构原理

前言 对于区块链方面多技术,我还是建议大家多看英文文档,多利用Google来搜索技术文章. 怎么搭建自己专属V-P-N来访问Google,请看我之前发的文章: 新人如何快速搭建自己的个人网站以及自己专属V-P-N代理 Linux基金会于2015年12月启动了名为"超级账本"(Hyperledger)的开源项目,旨在推动各方协作,共同打造基于区块链的企业级分布式账本底层技术,用于构建支撑业务的行业应用和平台. 超级账本里包括10个项目(project),其中区块链框架类项目5个:Fabr