区块链优质币:在开发环境中测试Hyperledger Fabric Chaincodes

  Happyledger

  这是我hyperledger fabric系列文章的第四部分——happyledgerblog系列:)。在这篇文章中,我将展示如何在本地开发机器中构建、运行和测试(调试)链代码。

  正常的链代码是安装和运行在对等点上的。但是使用chaincode开发模式,我们可以在本地开发机器上运行和测试它们。在真正的网络上部署链代码之前,编译、运行和测试它们是值得的。

  与本文相关的所有部署文件和配置都是athlf-chaincode-dev gitlab repo。签出存储库并遵循以下步骤。

  1. 设置fabric开发网络

  首先,我们需要使用预先生成的orderer和channel构件部署dev mode docker容器。以下是在这个目录中找到的预生成工件。

  1.myc.block – 引导块

  2.myc.tx – 引导连接事物

  3.orderer.block – 预定块

  您可以像下面这样部署服务。它将启动并运行orderer、peer、cli和chaincode容器。Orderer以SingleSampleMSPSoloprofile开始,peer以dev-mode开始。

  # deploy following containers

  # 1. orderer

  # 2. peer

  # 3. cli

  # 4. chaincode

  docker-compose up -d

  2. 构建和运行链代码

  接下来我们需要在链代码容器中构建和运行链代码。我已经放了我的rahasak。进入chaincode/rahasak目录中的链代码。这个链代码具有用户创建、获取、搜索功能。

  package main

  import (

  "bytes"

  "encoding/json"

  "fmt"

  "github.com/hyperledger/fabric/core/chaincode/shim"

  "github.com/hyperledger/fabric/protos/peer"

  )

  type RahasakContract struct {

  }

  type User struct {

  Id string `json:"id"`

  Name string `json:"name"`

  Email string `json:"email"`

  }

  func (s *RahasakContract) Init(stub shim.ChaincodeStubInterface) peer.Response {

  args :=stub.GetStringArgs()

  fmt.Printf("INFO: init chaincode args: %s\n", args)

  return shim.Success(nil)

  }

  func (s *RahasakContract) Invoke(stub shim.ChaincodeStubInterface) peer.Response {

  // Retrieve the requested Smart Contract function and arguments

  function, args :=stub.GetFunctionAndParameters()

  fmt.Printf("INFO: invoke function: %s, args: %s\n", function, args)

  if function=="create" {

  return s.Create(stub, args)

  } else if function=="get" {

  return s.Get(stub, args)

  } else if function=="search" {

  return s.Search(stub, args)

  }

  return shim.Error("Invalid smart contract function")

  }

  func (s *RahasakContract) Create(stub shim.ChaincodeStubInterface, args []string) peer.Response {

  fmt.Printf("INFO: create with args: %s\n", args)

  // user

  usr :=User{

  Id: args[0],

  Name: args[1],

  Email: args[2],

  }

  usrJsn, _ :=json.Marshal(usr)

  err :=stub.PutState(args[0], usrJsn)

  if err !=nil {

  fmt.Printf("ERROR: error PutState: %s\n", err.Error())

  shim.Error("error PutState: " + err.Error())

  }

  return shim.Success(nil)

  }

  func (s *RahasakContract) Get(stub shim.ChaincodeStubInterface, args []string) peer.Response {

  fmt.Printf("INFO: get with args: %s\n", args)

  usr, _ :=stub.GetState(args[0])

  if usr==nil {

  return shim.Error("Could not get user with id: " + args[0])

  }

  return shim.Success(usr)

  }

  func (s *RahasakContract) Search(stub shim.ChaincodeStubInterface, args []string) peer.Response {

  fmt.Printf("INFO: search with args: %s\n", args)

  // from, to range comes with args

  frm :=args[0]

  to :=args[1]

  // search by range

  iterator, err :=stub.GetStateByRange(frm, to)

  if err !=nil {

  return shim.Error("Error search by range: " + err.Error())

  }

  defer iterator.Close()

  // build json respone

  buffer, err :=buildResponse(iterator)

  if err !=nil {

  return shim.Error("Error constract response: " + err.Error())

  }

  fmt.Printf("INFO: search response:%s\n", buffer.String())

  return shim.Success(buffer.Bytes())

  }

  func buildResponse(iterator shim.StateQueryIteratorInterface) (*bytes.Buffer, error) {

  // buffer is a JSON array containing query results

  var buffer bytes.Buffer

  buffer.WriteString("[")

  written :=false

  for iterator.HasNext() {

  resp, err :=iterator.Next()

  if err !=nil {

  return nil, err

  }

  // add a comma before array members, suppress it for the first array member

  if written==true {

  buffer.WriteString(",")

  }

  // record is a JSON object, so we write as it is

  buffer.WriteString(string(resp.Value))

  written=true

  }

  buffer.WriteString("]")

  return &buffer, nil

  }

  func main() {

  err :=shim.Start(new(RahasakContract))

  if err !=nil {

  fmt.Printf("ERROR: error creating rahasak contact: %s\n", err.Error())

  }

  }

  下面是在chaincode容器中构建和运行这个链代码的命令。

  # connect to chaincode container

  docker exec -it chaincode bash

  # build chaincode

  cd rahasak

  go build -o rahasak

  # run chaincode

  # when running we are specifying the chaincode name and version

  CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=rahasak1:0 https://www.qukuaiwang.com.cn/news/rahasak

  在运行chaincode时,我们指定了chaincode的唯一名称和版本(rahasak1.0)。现在chaincode已经在链代码容器中启动了。

  3.安装并实例化chaincode

  下一步是在peer中安装和实例化链代码(就像我们在真实fabric集群中安装和实例化链代码一样)。下面是这样做的方法。

  # install chaincode

  # we are given unique name and version of the chaincode

  peer chaincode install -p chaincodedev/chaincode/rahasak -n rahasak1 -v 0

  # instantiate chaincode

  # we are giving channel name and chaincode name

  peer chaincode instantiate -n rahasak1 -v 0 -c '' -C myc

  在安装和实例化时,我们需要指定chaincode的名称。在这里,我将rahasak1作为名称,0作为版本。现在,我们的chaincode设置已经准备好进行测试。

  4.测试chaincode

  要测试chaincode,我们可以执行调用、查询事务。下面是这样做的方法。

  # invoke transactions with 'create'

  peer chaincode invoke -n rahasak1 -c '{"Args":["create", "001", "lambda", ""]}' -C myc

  peer chaincode invoke -n rahasak1 -c '{"Args":["create", "002", "ops", ""]}' -C myc

  # query transactions with 'get'

  # output - {"id":"001","name":"lambda","email":""}

  peer chaincode query -n rahasak1 -c '' -C myc

  # query transactions with 'search'

  # output

  [{"id":"001","name":"lambda","email":""},{"id":"002","name":"ops","email":""}]

  peer chaincode query -n rahasak1 -c '' -C myc

  更多区块链信息:www.qukuaiwang.com.cn/news

文章内容系本站作者个人观点,不代表本站对其观点赞同或支持,文章的版权归该作者所有。如需转载,请注明文章来源。本文地址:http://www.cis.net.cn/kejikuaixun/43832.html
留言与评论(共有 条评论)
验证码:

最新文章

在开发环境中测试Hyperledger Fabric Chaincodes

科技快讯
Happyledger这是我hyperledgerfabric系列文章的第四部分——happyledgerblog系列:)。在这篇文章中,我将展示如何在本地开发机器中构建、运行和测试(调试)链代码。正常的链代码是安装和运行在对等点上的。但是使用chaincode开发模式,我们可以在本地开发机器上运行和测试它们。在真正的网络上部署链

尼日利亚总统要求汇丰银行返还被盗的1亿美元资金

科技快讯
传统银行对于去中心化的加密货币例如比特币深恶痛绝。因为比特币让人们可以直接交易,绕开银行和中间商。银行通过提供服务例如存款,收取手续费盈利。所以他们讨厌加密货币,也就不足为奇了。但是,银行并不是无辜的,他们助长我们这个时代一些非常严重的金融犯罪

每周要闻20181201-20181207

科技快讯
合作12月5日唯链携手日本富士MARUMO茶园共同将区块链技术应于日本茶业原产地认证,通过先进的区块链+物联网解决方案,为客户提供验证服务,用户只需使用智能手机读取包装上嵌入的NFC芯片,便可对茶产品原产地进行追溯。12月6日唯链加入MITMediaLab(MIT媒体实验室),致力于与其它来自多行业的实验室成员共同探索应用设计和技术转化以解决

一部真正讲区块链的电影,终于上映了!你看懂了么?

科技快讯
58同城的一位总裁大佬这样说:“区块链有可能和互联网一样的伟大…这可能是一个比人工智能还有颠覆性的历史机遇”。从比特币爆红的状态中展现黑马风范,再到区块链大佬建立区块链微信群,中央网的“三问区块链”,甚至阿里巴巴以及万达对区块链布局的大手笔。区块链的城堡已经在各个方位展示着自己今时今日的魅力。我们在真正的深入

一帆看市7.27数字货币行情分析:币市利空消息已来

科技快讯
7月27日讯,美国证监会(SEC)26日拒绝了数字货币交易所Gemini创始人、比特币亿万富翁Winklevoss兄弟提出的一只比特币ETF申请,不认同他们提出的比特币市场能抵御操纵说法,并且强调这一市场存在欺诈和价格操纵问题。这是今日早间一条消

抗击疫情(抗击疫情标语)

科技快讯
疫情之下,临时医院的搭建、医疗防护物资的生产,让制造业迎来大考。工人复工难、物资调配紧张等问题也让制造业产能恢复面临着诸多挑战。工业互联网作为工业经济全要素、全价值链、全产业链,全面连接新型基础设施,发挥其在万物互联、信息汇聚、优化调度、异地协同、远程服务等方面的优势,助力抗击疫情工作。汇聚医疗物资信息助力缓

小白狼说币7/30数字货币行情分析:市场萎靡,Dock逆势大涨

科技快讯
盘面:今日市场整体小幅震荡下行,前百大市值币种跌多涨少,市场热点匮乏,Dock成为今日市场亮点。受益于今日18:00上线币安的消息面影响,Dock盘中大幅拉升,涨幅一度超50%。今日市场情绪面变化不大,恐惧&贪婪指数为53,维持贪婪状态。比特币今日早间短时放量下跌,一度跌至8000美元关口。随后跌势企稳,围