github.com/kchristidis/fabric@v1.0.4-0.20171028114726-837acd08cde1/examples/chaincode/go/sleeper/sleeper.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 // Sleeper chaincode sleeps and works with one state variable 20 // Init - 1 param, a sleep time in millisecs 21 // Invoke - 4 or 3 params, "put" or "get", value to set and sleep time in millisecs 22 // 23 // Sleeper can be used to test the "chaincode.executetimeout" property 24 25 import ( 26 "fmt" 27 "strconv" 28 "time" 29 30 "github.com/hyperledger/fabric/core/chaincode/shim" 31 pb "github.com/hyperledger/fabric/protos/peer" 32 ) 33 34 // SleeperChaincode example simple Chaincode implementation 35 type SleeperChaincode struct { 36 } 37 38 func (t *SleeperChaincode) sleep(sleepTime string) { 39 st, _ := strconv.Atoi(sleepTime) 40 if st >= 0 { 41 time.Sleep(time.Duration(st) * time.Millisecond) 42 } 43 } 44 45 // Init initializes chaincode...all it does is sleep a bi 46 func (t *SleeperChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { 47 args := stub.GetStringArgs() 48 49 if len(args) != 1 { 50 return shim.Error("Incorrect number of arguments. Expecting 1") 51 } 52 53 sleepTime := args[0] 54 55 t.sleep(sleepTime) 56 57 return shim.Success(nil) 58 } 59 60 // Invoke sets key/value and sleeps a bit 61 func (t *SleeperChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { 62 function, args := stub.GetFunctionAndParameters() 63 if function == "put" { 64 if len(args) != 3 { 65 return shim.Error("Incorrect number of arguments. Expecting 3") 66 } 67 68 // Make payment of X units from A to B 69 return t.invoke(stub, args) 70 } else if function == "get" { 71 if len(args) != 2 { 72 return shim.Error("Incorrect number of arguments. Expecting 2") 73 } 74 75 // the old "Query" is now implemtned in invoke 76 return t.query(stub, args) 77 } 78 79 return shim.Error("Invalid invoke function name. Expecting \"put\" or \"get\"") 80 } 81 82 // Transaction makes payment of X units from A to B 83 func (t *SleeperChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response { 84 // set state 85 key := args[0] 86 val := args[1] 87 88 err := stub.PutState(key, []byte(val)) 89 if err != nil { 90 return shim.Error(err.Error()) 91 } 92 93 sleepTime := args[2] 94 95 //sleep for a bit 96 t.sleep(sleepTime) 97 98 return shim.Success([]byte("OK")) 99 } 100 101 // query callback representing the query of a chaincode 102 func (t *SleeperChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response { 103 key := args[0] 104 105 // Get the state from the ledger 106 val, err := stub.GetState(key) 107 if err != nil { 108 return shim.Error(err.Error()) 109 } 110 111 sleepTime := args[1] 112 113 //sleep for a bit 114 t.sleep(sleepTime) 115 116 return shim.Success(val) 117 } 118 119 func main() { 120 err := shim.Start(new(SleeperChaincode)) 121 if err != nil { 122 fmt.Printf("Error starting Sleeper chaincode: %s", err) 123 } 124 }