1. 開啟Docker拉取鏡像,在https://hub.docker.com/可以查看鏡像版本,為了配合畢設我們拉取0.6版本,並把tag重新命名為latest
docker pull hyperledger/ fabric-peer:x86_64-0.6.1-preview
docker pull hyperledger/ fabric-membersrvc:latest
docker images
2. 將編寫好的docker-compose.yml儲存到本地c/Users/rjy以便後續運行使用
membersrvc: image: hyperledger/fabric-membersrvc ports: - "7054:7054" command: membersrvcvp0: image: hyperledger/fabric-peer ports: - "7050:7050" - "7051:7051" - "7053:7053" environment: - CORE_PEER_ADDRESSAUTODETECT=true - CORE_VM_ENDPOINT=unix:///var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=vp0 - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054 - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054 - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054 - CORE_SECURITY_ENABLED=true - CORE_SECURITY_ENROLLID=test_vp0 - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT links: - membersrvc command: sh -c "sleep 5; peer node start --peer-chaincodedev"
3. docker輸入docker-compose up
4. mRemoteNG連結Docker,
Host : 192.168.99.100
User name : docker
Password : tcuser
協議 : SSHv2
5. mRemoteNG輸入docker ps
6. mRemoteNG輸入docker exec -it rjy_vp0_1 bash
7. 退回到.../github.com建立一個SaveState檔案夾 mkdir SaveState
8. 進入SaveState,輸入vi SaveState2.go建立一個SaveState.go檔案
9. 按下i鍵,從下面複製代碼,在mRemoteNG點擊右鍵粘貼過來
package main import ( "errors" "fmt" "github.com/hyperledger/fabric/core/chaincode/shim") type SaveState2Chaincode struct {} func (t *SaveState2Chaincode) Init(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) { fmt.Printf("Init called with function %s!\n", function) return nil, nil} func (t *SaveState2Chaincode) Invoke(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) { fmt.Printf("Invoke called with function %s!\n", function) var key, value string key = args[0] value = args[1] var err error err = stub.PutState(key, []byte(value)) if err != nil { return nil, err } return nil, nil } func (t *SaveState2Chaincode) Query(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) { fmt.Printf("Query called with function %s!\n", function) var key string key = args[0] valInBytes, err := stub.GetState(key) if err != nil { return nil, errors.New("Failed to get state for " + key) } message := "State for " + key + " = " + string(valInBytes) return []byte(message), nil} func main() { err := shim.Start(new(SaveState2Chaincode)) if err != nil { fmt.Printf("Error starting Save State chaincode: %s", err) }}
10. :wq
11. go build ./ 注意build後邊有一個空格,運行完這一句會出現一個綠色的檔案
12. export CORE_CHAINCODE_ID_NAME=mycc
13. export CORE_PEER_ADDRESS=0.0.0.0:7051
14. ./SaveState &
15. 向Hyperledger服務介面http://192.168.99.100:7050/registrar 發送如下REST請求,使用內建的jim使用者登入系統
{
"enrollId": "jim",
"enrollSecret": "6avZQLwcUe9b"
}
16. 向Hyperledger服務介面http://192.168.99.100:7050/chaincode 發送如下REST請求
{
"jsonrpc" : "2.0",
"method" : "invoke",
"params" : {
"type" : 1,
"chaincodeID" : {
"name" : "mycc"
},
"ctorMsg" : {
"function":"invoke",
"args":[ "testKey","PipiXia,Let’s go!" ]
},
"secureContext" : "jim"
},
"id" : 3
}
17.
{
"jsonrpc" : "2.0",
"method" : "query",
"params" : {
"type" : 1,
"chaincodeID" : {
"name" : "mycc"
},
"ctorMsg" : {
"function":"query",
"args":[ "testKey"]
},
"secureContext" : "jim"
},
"id" : 5
}