Writing, Building, and Running Chaincode in a Development Environment

Chaincode的开发者需要通过建立一个完善的peer network等一些方式去测试或者debug他们的chaincode。当你想要chaincode来运行,你首先需要通过CLI,REST API,gRPC API或者SDK来部署它。根据接收到的请求,peer节点将要对等节点的docker来使chaincode运行起来。这个debug chaincode的下面环境的配置部署的步骤很简单并不是很复杂,是由于这些步骤的循环:launch chaincode - debug docker container - fix problem - launch chaincode - lather - rinse - repeat.比如说:fabric peer 有一个--peer-chaincodedev 的标志。这个标志可以不通过decker容器来部署chaincode而被启动命令来建立peer节点。

 

下列指令允许去通过JAVA或者GO来开发chaincode。他们不被允许运行在生产环境中。然而,如果使用JAVA来开发chaincode,请看https://github.com/hyperledger/fabric/blob/master/docs/Setup/JAVAChaincode.md 这个网址的介绍来首先确定你的环境已经正确的配置好了

 

注意: 我们需要增加System chaincode的支持

 

Choices

 

开始之后,你可以选择下面的其中一个步骤进行:

1:使用Vagrant的开发环境,这个环境被用来开发fabric

2:在windows或者Mac上面使用docker

3:使用docker的toolbox

 

如果通过步骤2或者步骤3,再进行之前,你需要保证一切都是从头开始进行的,并且也不需要保持一个克隆的fabric的Github导出当前的数据。反而,你可以简单的拉取并且运行fabric-peer和fabric-membersrvc从DockerHub来进行镜像引导

 

你需要多个命令行窗口--基本上每个终端窗口对应了每个不同的组件。比如:其中一个来运行validating peer(验证节点),再有一个来运行chaincode,另外的一个来运行CLI或者REST API命令去运行事务(交易).最后,当可以安全运行的时候,一个附加的(第四个)窗口被需要用来运行Certificate Authority(CA)服务.更详细的说明在下面的章节中讲到

 

Option 1 Vagrant开发环境

 

安全设置(可选)

 

devenv的子目录设置成为你的工作环境(workspace),然后ssh到Vagrant环境中:

 

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

 

设置好了本地的安全开发环境之后,你必须首先建立并且运行Certificate Authority (CA)服务:

cd $GOPATH/src/github.com/hyperledger/fabric

make membersrvc && membersrvc

 

在命令行的基础上运行CA服务来默认设置,它被定义在了membersrvc.yaml这个配置文件中.默认的配置包括了已经注册了CA服务的多个用户,这些用户被列举在了配置文件中的eca.users节点目录中。去注册其他的用户使用CA进行测试,你可以修改eca.users节点目录中的内容,这个目录中包括了enrollmentID和enrollmentPW的键值对,修改它们即可。注意一下enrollmentPW之前的整数.

那个整数标志了用户的一些规则:1代表客户,2代表非验证节点,4代表验证节点,8代表auditor

 

运行验证节点

注意:去安全运行,在peer执行之前,首先要修改core.yaml这个配置文件去设置security.enabled的值为true。或者,你可以启用安全来运行peer并且设置环境变量:CORE_SECURITY_ENABLED = true。启用隐私和保密的交易(这也需要安全启用),修改core.yaml配置文件中,设置security.privacy的值为true。或者,你可以通过设置下面的环境变量来启用隐私保护:CORE_SECURITY_PRIVACY=true,如果你通过修改环境变量来进行隐私保护措施,那么当运行所有的peer操作的子请求的时候,就需要去包括了这些环境变量在命令中。(比如:deploy,invoke或者query)

 

在一个新的命令行窗口中,从devenv的子目录中

 

 

运行chaincode

 

开启一个新的终端窗口

 

使用ssh命令进入到虚拟机中

 

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

 

接下来,我们将建立chaincode_example02项目的代码,它被Hyperledger fabric源代码项目来提供。如果你使用的是方法1,那么你可以复制下面的命令到你的命令行中

cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

go build

 

当你准备开始创建你自己的chaincode程序,创建一个新的子目录在$GOPATH/src目录下面。你可以复制chaincode_example02文件到你的新目录下面并且进行修改的操作.

开始注册一个新的chaincode

 

运行下面的chaincode命令去开启并且注册chaincode到验证节点中:

CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:30303 ./chaincode_example02

 

chaincode的控制台将会显示出信息“Received REGISTERED, ready for invocations”,这表明了chaincode已经准备去接受请求了。按着步骤进行chaincode的部署,invoke或者query的事务。如果“Received REGISTERED”信息没有显示出来的话,是因为可能在你部署的时候发生了一些错误。

 

运行CLI或者REST API

通过CLIREST部署chaincode

通过CLIREST调用chaincode

通过CLIREST查询chaincode

 

如果你要通过安全模式运行,你可以去看”当安全模式时移除临时文件”去学习如何去清除临时文件。

看到日志控制参考信息对等和chaincodes控制日志输出。

 

终端3CLI或者REST API

记录REST API端口

默认的REST接口的端口号是7050.它可以在文件core.yaml中的rest.address属性进行修改配置。如果使用Vagrant,那么REST端口映射被定义在Vagrantfile

 

 

 

记录安全功能

 

当前安全实现的基础,是假设终端用户身份验证发生在应用程序层和不处理的fabric.身份验证可以通过任何方式被认为是适合目标应用程序.用户一经成功的实验,这个应用将会执行用户曾经正确注册的CA.如果登记是尝试一秒对于同一个用户,将会产生一个错误的结果.在注册期间,应用将会发送一个请求给权威的证书去验证用户的注册是否成功,CA响应用户的证书和key.登记和交易收到CA的验证将会被保存在本地的/var/hyperledger/production/crypto/client/目录中.这个目录存在于一个特殊的peer节点,这个目录允许用户去交易仅仅通过这个特殊的peer节点当使用存储加密材料的时候.如果用户最终需要超过一个peer节点去执行交易,应用程序负责复制其他对等节点进行加密操作......

 

启用了安全,CLI命令和REST有效负荷必须去修改包含在其中的enrollmentID 来判断哪个注册的用户登录了进去。否则将会产生一个错误的而结果。一个注册的用户可以通过CLI或者REST API来记录(依循本页下面的说明)。通过CLI来记录,出现下面的命令,usernameenrollmentID其中的一个值在membersrvc.yarm文件中的eca.users部分中。

从你的命令行终端中,移动到devenv你的工作环境子目录中。登陆进去Vagrant终端中通过执行下面的命令:

Vagrant ssh

注册用户通过CLI,恰当地取代

    cd $GOPATH/src/github.com/hyperledger/fabric/peer

    peer network login

这个命令将会提示输入密码,密码必须匹配enrollmentPW 列表中对于目标用户的membersrvc.yaml文件中的eca.users部分。如果密码不匹配将会报错。

通过REST API去登陆,发送一个POST请求到/registrar的终端,包含的enrollmentIDenrollmentPW条目在membersrvc.yaml文件中的eca.users部分中

REST请求:

POST localhost:5000/registrar

 

{

  "enrollId": "jim",

  "enrollSecret": "6avZQLwcUe9b"

}

REST响应:

200 OK

{

    "OK": "Login successful for user 'jim'."

}

 

Chaincode通过CLIREST进行部署

首先,发送一个部署chaincode交易,这一次,去到验证性的peer节点中。CLI连接到可验证的peer节点中,属性定义在core.yaml文件中。注意:部署交易通常需要一个路径参数来定位,build,并且部署chaincode。然而,因为这些指令是特定于本地开发模式和手动chaincode部署,使用name参数来进行代替

 

peer chaincode deploy -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

 

 

或者说,你可以通过REST API来运行、部署chaincode交易

 

REST请求:

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "deploy",

  "params": {

    "type": 1,

    "chaincodeID":{

        "name": "mycc"

    },

    "ctorMsg": {

        "function":"init",

        "args":["a", "100", "b", "200"]

    }

  },

  "id": 1

}

 

REST 响应:

 

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "mycc"

    },

    "id": 1

}

 

注意:当启用安全性,修改CLI命令和REST API通过enrollmentID来登陆到用户中。去登录到注册的用户中通过CLI或者REST API,根据下面的说明:“note on security functionality”。在CLI里面,enrollmentID通过使用-u的参数;而在REST API中,enrollmentID则是通过secureContext元素。如果你启用安全性并且保证变量环境peer进程的隐私性,那么当运行所有的子请求peer操作(比如:deploy,invoke或者query)的时候,那么在命令中包含这些环境变量就显得特别重要。

  CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

 

REST请求:

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "deploy",

  "params": {

    "type": 1,

    "chaincodeID":{

        "name": "mycc"

    },

    "ctorMsg": {

        "function":"init",

        "args":["a", "100", "b", "200"]

    },

    "secureContext": "jim"

  },

  "id": 1

}

 

 

通过运行目标初始化的方法来部署chaincode的交易初始化。通过标明是“init”方法的例子,名字可以被chaincode开发者任意地选择。你将会看到chaincode窗口中,下面的输出内容:

  2015/11/15 15:19:31 Received INIT(uuid:005dea42-d57f-4983-803e-3232e551bf61), initializing chaincode

    Aval = 100, Bval = 200

 

通过CLI和REST来调用chaincode

 

通过CLI来调用chaincode交易并且多次运行。- n参数应与chaincode窗口提供的值匹配(打开Vagrant终端2):

peer chaincode invoke -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

 

或者,通过REST API 来调用chaincode交易

 

REST请求:

 

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "invoke",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"invoke",

         "args":["a", "b", "10"]

      }

  },

  "id": 3

}

 

REST响应:

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "5a4540e5-902b-422d-a6ab-e70ab36a2e6d"

    },

    "id": 3

}

 

注意:当启用安全性,修改CLI命令和REST API通过enrollmentID来登陆到用户中。去登录到注册的用户中通过CLI或者REST API,根据下面的说明:“note on security functionality”。在CLI里面,enrollmentID通过使用-u的参数;而在REST API中,enrollmentID则是通过secureContext元素。如果你启用安全性并且保证变量环境peer进程的隐私性,那么当运行所有的子请求peer操作(比如:deploy,invoke或者query)的时候,那么在命令中包含这些环境变量就显得特别重要。

 CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

 

REST 请求:

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "invoke",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"invoke",

         "args":["a", "b", "10"]

      },

      "secureContext": "jim"

  },

  "id": 3

}

 

通过“invoke”指定的参数来调用chaincode指定的交易方法。这个交易将会从A到B转移10个单位。你将会看到chaincode窗口中,下面的输出内容:

  2015/11/15 15:39:11 Received RESPONSE. Payload 200, Uuid 075d72a4-4d1f-4a1d-a735-4f6f60d597a9

Aval = 90, Bval = 210

 

通过CLI和REST来查询chaincode

 

chaincode上面运行一个查询来得到期望得到的结果。-n参数应该和在chaincode窗口中提供的值匹配(打开Vagrant终端2)

 

   peer chaincode query -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

 

响应的内容应该和下面的内容差不多:

 

 {"Name":"b","Amount":"210"}

 

如果这个查询的名字不存在a或者b 就会发送给chaincode_example02
你会看要像是如下的报错信息:

  {"Error":"Nil amount for c"}

或者,通过REST API来运行查询chaincode

REST 请求:

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "query",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"query",

         "args":["a"]

      }

  },

  "id": 5

}

 

REST 响应:

 

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "90"

    },

    "id": 5

}

注意:当启用安全性,修改CLI命令和REST API通过enrollmentID来登陆到用户中。去登录到注册的用户中通过CLI或者REST API,根据下面的说明:“note on security functionality”。在CLI里面,enrollmentID通过使用-u的参数;而在REST API中,enrollmentID则是通过secureContext元素。如果你启用安全性并且保证变量环境peer进程的隐私性,那么当运行所有的子请求peer操作(比如:deploy,invoke或者query)的时候,那么在命令中包含这些环境变量就显得特别重要。

 

   CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

 

REST请求:

POST host:port/chaincode

 

{

  "jsonrpc": "2.0",

  "method": "query",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"query",

         "args":["a"]

      },

      "secureContext": "jim"

  },

  "id": 5

}

 

当进行安全认证的时候要移除临时文件

 

注意:这一步仅仅适用于基于在option1的步骤后面。而对于选项2或3,就需要通过docker来进行清理的操作了。

在安全模式下完成了了chaincode的测试之后,要移除被CA服务进程来创建的临时文件。去移除客户端注册的认证凭证,注册的key,交易凭证链,等等...

运行,运行下面的命令。注意,如果你想去注册一个先前已经注册好了的用户的话,你就必须运行这些命令

ssh进去你的Vagrant,然后粘贴下面的命令:

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

 

然后运行:

 

rm -rf /var/hyperledger/production

 

你可能感兴趣的:(chaincode)