// Query has two functions // get - takes one argument, a key, and returns the value for the key // keys - returns all keys stored in this chaincode func (t *SimpleChaincode) Query(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) { switch function { case "get": if len(args) < 1 { return nil, errors.New("get operation must include one argument, a key") } key := args[0] value, err := stub.GetState(key) if err != nil { return nil, fmt.Errorf("get operation failed. Error accessing state: %s", err) } return value, nil case "keys": keysIter, err := stub.RangeQueryState("", "") if err != nil { return nil, fmt.Errorf("keys operation failed. Error accessing state: %s", err) } defer keysIter.Close() var keys []string for keysIter.HasNext() { key, _, iterErr := keysIter.Next() if iterErr != nil { return nil, fmt.Errorf("keys operation failed. Error accessing state: %s", err) } keys = append(keys, key) } jsonKeys, err := json.Marshal(keys) if err != nil { return nil, fmt.Errorf("keys operation failed. Error marshaling JSON: %s", err) } return jsonKeys, nil default: return nil, errors.New("Unsupported operation") } }
// Invoke has two functions // put - takes two arguements, a key and value, and stores them in the state // remove - takes one argument, a key, and removes if from the state func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) ([]byte, error) { function, args := stub.GetFunctionAndParameters() switch function { case "put": if len(args) < 2 { return nil, errors.New("put operation must include two arguments, a key and value") } key := args[0] value := args[1] err := stub.PutState(key, []byte(value)) if err != nil { fmt.Printf("Error putting state %s", err) return nil, fmt.Errorf("put operation failed. Error updating state: %s", err) } return nil, nil case "remove": if len(args) < 1 { return nil, errors.New("remove operation must include one argument, a key") } key := args[0] err := stub.DelState(key) if err != nil { return nil, fmt.Errorf("remove operation failed. Error updating state: %s", err) } return nil, nil case "get": if len(args) < 1 { return nil, errors.New("get operation must include one argument, a key") } key := args[0] value, err := stub.GetState(key) if err != nil { return nil, fmt.Errorf("get operation failed. Error accessing state: %s", err) } return value, nil case "keys": keysIter, err := stub.RangeQueryState("", "") if err != nil { return nil, fmt.Errorf("keys operation failed. Error accessing state: %s", err) } defer keysIter.Close() var keys []string for keysIter.HasNext() { key, _, iterErr := keysIter.Next() if iterErr != nil { return nil, fmt.Errorf("keys operation failed. Error accessing state: %s", err) } keys = append(keys, key) } jsonKeys, err := json.Marshal(keys) if err != nil { return nil, fmt.Errorf("keys operation failed. Error marshaling JSON: %s", err) } return jsonKeys, nil default: return nil, errors.New("Unsupported operation") } }