1. 程式人生 > >區塊鏈學習之Fabric的chaincode的部署

區塊鏈學習之Fabric的chaincode的部署

上一節環境部署ok了,就不自覺的手癢想要自己跑一個小demo看看,據我瞭解,fabric的開發分為兩個,一個是chaincode,一個是applicaiton開發(這需要呼叫sdk,這是後話了)。

開發環境準備:

atom(百度看說用這個順手,就下了一個,本人是Java出身,IDEA玩的比較熟)。

chaincode程式碼例項:

chaincode001.go(做一個簡單的set和get操作)

package main

import(
  "fmt"
  "github.com/hyperledger/fabric/core/chaincode/shim"
  "github.com/hyperledger/fabric/protos/peer"
)

type Helloworld struct{

}

func (t *Helloworld) Init(stub shim.ChaincodeStubInterface) peer.Response {

  args:=stub.GetStringArgs()

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

  if err != nil{
    shim.Error(err.Error())
  }

  return shim.Success(nil)
}

func (t *Helloworld) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
  fn, args := stub.GetFunctionAndParameters()

  if fn == "set"{
    return t.set(stub,args)
  }else if fn == "get"{
    return t.get(stub,args)
  }

  return shim.Error("error solution")

}

func (t *Helloworld) set(stub shim.ChaincodeStubInterface, args []string) peer.Response{
   err := stub.PutState(args[0],[]byte(args[1]))

   if err != nil{
     shim.Error(err.Error())
   }

   return shim.Success(nil)

}

func (t *Helloworld) get(stub shim.ChaincodeStubInterface, args []string) peer.Response{
   value, err := stub.GetState(args[0])

   if err != nil{
     return shim.Error(err.Error())
   }

   return shim.Success(value)

}

func main() {
   err := shim.Start(new(Helloworld))
   if err != nil {
      fmt.Printf("Error starting Simple chaincode: %s", err)
   }
}

chaincode001_test.go(本地的一個小單元測試)

package main

import (
    "fmt"
    "testing"
    "github.com/hyperledger/fabric/core/chaincode/shim"
)

func checkInit(t *testing.T, stub *shim.MockStub, args [][]byte) {
    res := stub.MockInit("1", args)
    if res.Status != shim.OK {
        fmt.Println("Init failed", string(res.Message))
        t.FailNow()
    }
}

func checkQuery(t *testing.T, stub *shim.MockStub, name string) {
    res := stub.MockInvoke("1", [][]byte{[]byte("get"), []byte(name)})
    if res.Status != shim.OK {
        fmt.Println("Query", name, "failed", string(res.Message))
        t.FailNow()
    }
    if res.Payload == nil {
        fmt.Println("Query", name, "failed to get value")
        t.FailNow()
    }

    fmt.Println("Query value", name, "was ", string(res.Payload))

}

func checkInvoke(t *testing.T, stub *shim.MockStub, args [][]byte) {
    res := stub.MockInvoke("1", args)
    if res.Status != shim.OK {
        fmt.Println("Invoke", args, "failed", string(res.Message))
        t.FailNow()
    }
}

func Test_Helloworld(t *testing.T) {

    hello := new(Helloworld)
    stub := shim.NewMockStub("hello", hello)

    checkInit(t, stub, [][]byte{[]byte("str"), []byte("helloworld")})
    checkQuery(t, stub, "str")

    checkInvoke(t, stub, [][]byte{[]byte("set"), []byte("str"), []byte("helloworld-1111")})
    checkQuery(t, stub, "str")
}

測試(遇到一些語法問題,畢竟第一次使用go):

[email protected]:~/go/goproject/chaincode001$ go test -v chaincode001_test.go chaincode001.go 
=== RUN   Test_Helloworld
Query value str was  helloworld
Query value str was  helloworld-1111
--- PASS: Test_Helloworld (0.00s)
PASS
ok  	command-line-arguments	0.007s

部署到fabric中:

深藍居

參考步驟的話只要從第5步驟開始就行。

1.切換節點

CORE_PEER_LOCALMSPID="Org1MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

2. 安裝程式碼(此處我將自己的chaincode放到啦相同的目錄下,避免不必要的麻煩主要是)

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode001

3.例項化(注意不能和以前例項化的一樣,本地一開始搭建環境時已經例項化一個mycc了)

peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n helw -v 1.0 -c '{"Args":["str","helloworld"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"

4. get操作

peer chaincode query -C mychannel -n helw -c '{"Args":["get","str"]}'

5. set操作

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n helw -c '{"Args":["set","str","helwworld111"]}'

基本都是在嘗試中成功的,不容易,後續切換節點什麼的可以參考部落格裡的其他操作。

相關推薦

區塊學習Fabric的chaincode的部署

上一節環境部署ok了,就不自覺的手癢想要自己跑一個小demo看看,據我瞭解,fabric的開發分為兩個,一個是chaincode,一個是applicaiton開發(這需要呼叫sdk,這是後話了)。 開發環境準備: atom(百度看說用這個順手,就下了一個,本人是Java出

區塊學習】以Linux為例,通過控制檯部署和執行智慧合約

安裝環境 安裝以太坊環境 (1) sudo apt-get install software-properties-common (2)sudo add-apt-repository -y ppa:ethereum/ethereum

劍英的區塊學習手記(一)

strong mage git 人生 極客 lease 黑錢 開篇 png 開篇布拉拉 因為參與了小蟻的c#智能合約編譯器的開發,讓我第一次近距離接觸到區塊鏈技術。 以前我對區塊鏈技術的了解,只知道有一種叫做比特幣的玩意兒,以前有同事在幾百塊一個比特幣的時候屯了一批,後

區塊學習一基本知識

法律法規 現實社會 的人 blog 本質 驅動 延遲 方式 什麽是 一、什麽是區塊鏈 在符合現實社會法律法規前提下,可治理的,依賴於密碼學算法和博弈經濟性設計,基於共識算法,對發生在主體間的價值創造,價值轉移,價值交換,以及涉及到各個價值主體由機器驅動的業務流程,在多個對

ZooKeeper 學習 安裝 部署

安裝 apach 編寫 端口 erro lang 問題 名稱 cal ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,ZooKeeper是以Fast Paxos算法為基礎,實現同步服務,配置維護和命名服務等分布式應用。 Zookeeper 分布式服務框

區塊學習

次數 因此 技術 gpo 很多 進行 做了 怎麽辦 min 一、區塊鏈的本質 區塊鏈是什麽?一句話,它是一種特殊的分布式數據庫。 首先,區塊鏈的主要作用是儲存信息。任何需要保存的信息,都可以寫入區塊鏈,也可以從裏面讀取,所以它是數據庫。 其次,任何人都可以架設服務器,加入區

區塊學習路線

part mar cad 原理 ger books db4 密碼學 algo 2018年春節最火熱的概念應該就是區塊鏈了,從百度的萊茨狗和網易星球刷屏朋友圈,到3點鐘區塊鏈無眠群的大火, 大佬們紛紛進軍區塊鏈,不了解區塊鏈好像錯過了什麽,這裏把自己學習區塊鏈過程中的一

區塊技術密碼學技術數字證書

自己 對稱加密 key ast 機構 成對 -m 操作 之前 數字證書 數字證書用來證明某個公鑰是誰的,並且內容是正確的。 對於非對稱加密算法和數字簽名來說,很重要的一點就是公鑰的分發。一旦公鑰被人替換(典型的如中間人攻擊),則整個安全體系將被破壞掉。 怎麽確保一個公鑰確

區塊學習--win10下構建以太坊私

以太坊私鏈環境搭建構建以太坊私鏈1、環境是win10,下載對應的最新版本Ethereum-Wallet-win64-0-10-0.ziphttps://github.com/ethereum/mist/releases 2、解壓到指定目錄即可,運行Ethereum-Wallet初始化數據,私鏈搭建無需同步 3

區塊學習(2)--以太坊中基本概念

區塊鏈學習 以太坊基本概念1、以太幣單位換算。以太坊的單位,沿襲了科學界的傳統,用做過傑出貢獻的數學、密碼學專家的名字命名。以太坊的最小單位是 Wei。 Kwei(Babbage)= 10 的 3 次方 Wei Mwei(Lovelace)= 10 的 6 次方 Wei Gwei(Shannon)= 1

好膽你就來|來圓方圓,開啟你的區塊創業

圓方圓 圓方圓學院 圓方圓鏈圈 圓方圓成立於2017年9月,一直堅持聚集技術人才,成就技術人才的初心,經過一年發展,成為集區塊鏈技術培訓,書籍出版,技術研發,技術社群的綜合性技術生態圈。 旗下業務主要有兩大板塊培訓業務:圓方圓學院,區塊鏈技術名師合夥人。經過一年的發展,成為華南地區最知名的專業區塊

區塊學習(2)錢包

rar 結構 nic 通過 可能 如果 基本 方式 樹狀 比特幣中的錢包並不包含比特幣,只包含私鑰,每一個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。用戶用這些私鑰來簽名交易。可以說錢包是私鑰的容器。 最開始的錢包只儲存隨機生成的私鑰。這種類型的錢包被稱作零型

區塊學習(4)交易(二)

圖靈 比特幣 生成 入棧 部分 pub png 組合 數字 上次大致講了比特幣的交易模式。接著講講比特幣的交易。比特幣的交易驗證引擎依賴於兩類腳本來驗證比特幣交易:一個鎖定腳本和一個解鎖腳本。 鎖定腳本鎖定了一個輸出值,同時它明確了今後花費這筆輸出的條件。鎖定腳本往往含有一

區塊學習(6)區塊

有序 打包成 info 運算 區塊鏈 ash 互連 包含 hash 寫了幾篇區塊鏈的學習筆記,今天來寫寫比特幣中的區塊鏈。比特幣中區塊鏈是由包含交易信息的區塊從後向前有序鏈接起來的數據結構。每個區塊從後向前有序地鏈接在這個鏈條裏,每個區塊都指向前一個區塊。 區塊結構 區塊是

區塊學習筆記:共識演算法

本文主題:共識、演算法、共識演算法名詞解析,以及簡單理解PRS協議所採用的共識演算法 1、 什麼是共識?共識是共同的認識。 什麼是演算法?演算法是利用計算機處理問題的解決步驟。 演算法的基礎——結構化程式設計的思想 用計算機編寫程式時,為了提高應用程式的效率

用go編寫區塊系列7--網路

1 區塊鏈中的網路 區塊鏈是一個分散式資料庫,所謂的分散式就是分散在多臺電腦上面,所以需要具有網路通訊功能。區塊鏈是一個分散式系統,意味著其中沒有客戶端和伺服器,所有的網路節點都是平等的。一個節點兼具伺服器和客戶端倆種角色,這與傳統的網路應用非常不同。 區塊鏈網路使用P2P網路,即網路中的節

用go編寫區塊系列6--交易2

0 概述 在這個系列的前面幾篇文章我們說區塊鏈是一個分散式資料庫,但是在實踐中,我們選擇忽略了“分散式”而只關注“資料庫”。目前為止我們我們實現了區塊鏈作為資料庫的所有特性。這篇文章中我們將實現前面幾篇中我們忽略的一些機制,下篇文章我們將實現分散式特性。 1 挖礦獎勵 我們忽略的一件事情

用go編寫區塊系列5--地址與數字簽名

0 介紹 在上一篇文章我們實現了交易。你被灌輸了這樣一種觀念:在比特幣中沒有賬戶,個人資訊資料不需要也不會被儲存。但是仍然需要一些東西去證明你是一筆交易的輸出的所有者。這是比特幣需要地址的原因。之前我們使用字串去代表使用者地址,現在我們需要引入地址了。 1 地址密碼學 比特幣地址

用go編寫區塊系列4--交易1

0 介紹 比特幣區塊鏈的核心就是交易,區塊鏈唯一的目的就是用一種安全可信的方式去儲存交易,交易一經建立就無法更改。這章中我們將在區塊鏈中引入交易。 1 比特幣中的交易 如果你是開發網路應用的程式設計師,若讓你開發一個線上支付交易,你多半會在資料庫中建立倆張表:賬戶表和交易表。賬戶表中將會

用go編寫區塊系列3--持久化與命令列

在上一篇文章中我們構建了一個帶PoW挖礦功能的區塊鏈。我們這個區塊鏈已經很接近一個全功能的區塊鏈,但是它還缺少一些很重要的特性。這一章中我們將將實現將區塊鏈資料存入資料庫,並且編寫一個簡單的命令列介面去與區塊鏈進行互動。本質上區塊鏈是一個分散式資料庫,在這裡我們忽略“分散式”而只關注資料庫。 本