// updateAccountBalance updates the balance amount of an account ID // stub: chaincodestub // accountID: account will be updated with the new balance // contactInfo: contact information associated with the account owner (chaincode table does not allow me to perform updates on specific columns) // amount: new amount to be udpated with func (t *depositoryHandler) updateAccountBalance(stub *shim.ChaincodeStub, accountID string, contactInfo string, amount uint64) error { myLogger.Debugf("insert accountID= %v", accountID) //replace the old record row associated with the account ID with the new record row ok, err := stub.ReplaceRow(tableColumn, shim.Row{ Columns: []*shim.Column{ &shim.Column{Value: &shim.Column_String_{String_: accountID}}, &shim.Column{Value: &shim.Column_String_{String_: contactInfo}}, &shim.Column{Value: &shim.Column_Uint64{Uint64: amount}}}, }) if !ok && err == nil { myLogger.Errorf("system error %v", err) return errors.New("failed to replace row with account Id." + accountID) } return nil }
// Invoke callback representing the invocation of a chaincode // This chaincode will manage two accounts A and B and will transfer X units from A to B upon invoke func (t *SimpleChaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) { switch function { case "insertRowTableOne": if len(args) < 3 { return nil, errors.New("insertTableOne failed. Must include 3 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertTableOne failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("insertTableOne failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) row := shim.Row{Columns: columns} ok, err := stub.InsertRow("tableOne", row) if err != nil { return nil, fmt.Errorf("insertTableOne operation failed. %s", err) } if !ok { return nil, errors.New("insertTableOne operation failed. Row with given key already exists") } case "insertRowTableTwo": if len(args) < 4 { return nil, errors.New("insertRowTableTwo failed. Must include 4 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertRowTableTwo failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("insertRowTableTwo failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) col4Val := args[3] var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} col4 := shim.Column{Value: &shim.Column_String_{String_: col4Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) columns = append(columns, &col4) row := shim.Row{Columns: columns} ok, err := stub.InsertRow("tableTwo", row) if err != nil { return nil, fmt.Errorf("insertRowTableTwo operation failed. %s", err) } if !ok { return nil, errors.New("insertRowTableTwo operation failed. Row with given key already exists") } case "insertRowTableThree": if len(args) < 7 { return nil, errors.New("insertRowTableThree failed. Must include 7 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Val, err := strconv.ParseInt(args[2], 10, 64) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[2] must be convertable to int64") } col4Uint, err := strconv.ParseUint(args[3], 10, 32) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[3] must be convertable to uint32") } col4Val := uint32(col4Uint) col5Val, err := strconv.ParseUint(args[4], 10, 64) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[4] must be convertable to uint64") } col6Val := []byte(args[5]) col7Val, err := strconv.ParseBool(args[6]) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[6] must be convertable to bool") } var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int64{Int64: col3Val}} col4 := shim.Column{Value: &shim.Column_Uint32{Uint32: col4Val}} col5 := shim.Column{Value: &shim.Column_Uint64{Uint64: col5Val}} col6 := shim.Column{Value: &shim.Column_Bytes{Bytes: col6Val}} col7 := shim.Column{Value: &shim.Column_Bool{Bool: col7Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) columns = append(columns, &col4) columns = append(columns, &col5) columns = append(columns, &col6) columns = append(columns, &col7) row := shim.Row{Columns: columns} ok, err := stub.InsertRow("tableThree", row) if err != nil { return nil, fmt.Errorf("insertRowTableThree operation failed. %s", err) } if !ok { return nil, errors.New("insertRowTableThree operation failed. Row with given key already exists") } case "insertRowTableFour": if len(args) < 1 { return nil, errors.New("insertRowTableFour failed. Must include 1 column value1") } col1Val := args[0] var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} columns = append(columns, &col1) row := shim.Row{Columns: columns} ok, err := stub.InsertRow("tableFour", row) if err != nil { return nil, fmt.Errorf("insertRowTableFour operation failed. %s", err) } if !ok { return nil, errors.New("insertRowTableFour operation failed. Row with given key already exists") } case "deleteRowTableOne": if len(args) < 1 { return nil, errors.New("deleteRowTableOne failed. Must include 1 key value") } col1Val := args[0] var columns []shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} columns = append(columns, col1) err := stub.DeleteRow("tableOne", columns) if err != nil { return nil, fmt.Errorf("deleteRowTableOne operation failed. %s", err) } case "replaceRowTableOne": if len(args) < 3 { return nil, errors.New("replaceRowTableOne failed. Must include 3 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("replaceRowTableOne failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("replaceRowTableOne failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) row := shim.Row{Columns: columns} ok, err := stub.ReplaceRow("tableOne", row) if err != nil { return nil, fmt.Errorf("replaceRowTableOne operation failed. %s", err) } if !ok { return nil, errors.New("replaceRowTableOne operation failed. Row with given key does not exist") } case "deleteAndRecreateTableOne": err := stub.DeleteTable("tableOne") if err != nil { return nil, fmt.Errorf("deleteAndRecreateTableOne operation failed. Error deleting table. %s", err) } err = createTableOne(stub) if err != nil { return nil, fmt.Errorf("deleteAndRecreateTableOne operation failed. Error creating table. %s", err) } return nil, nil default: return nil, errors.New("Unsupported operation") } return nil, nil }
func (t *RBACChaincode) addRole(stub *shim.ChaincodeStub, args []string) ([]byte, error) { if len(args) != 2 { return nil, errors.New("Incorrect number of arguments. Expecting 2") } id, err := base64.StdEncoding.DecodeString(args[0]) if err != nil { return nil, fmt.Errorf("Failed decoding tcert: %s", err) } //id := []byte(args[0]) role := args[1] myLogger.Debug("Add role [% x][%s]", id, role) // Verify that the invoker has the 'admin' role ok, _, err := t.hasInvokerRole(stub, "admin") if err != nil { return nil, fmt.Errorf("Failed checking role [%s]", err) } if !ok { return nil, errors.New("The invoker does not have the required roles.") } // Add role to id myLogger.Debug("Permission granted to the invoker") // Retrieve id's row var columns []shim.Column idCol := shim.Column{Value: &shim.Column_Bytes{Bytes: id}} columns = append(columns, idCol) row, err := stub.GetRow("RBAC", columns) if err != nil { return nil, fmt.Errorf("Failed retriving associated row [%s]", err) } if len(row.Columns) == 0 { // Insert row ok, err = stub.InsertRow("RBAC", shim.Row{ Columns: []*shim.Column{ &shim.Column{Value: &shim.Column_Bytes{Bytes: id}}, &shim.Column{Value: &shim.Column_String_{String_: role}}, }, }) if err != nil { return nil, fmt.Errorf("Failed inserting row [%s]", err) } if !ok { return nil, errors.New("Failed inserting row.") } } else { // Update row ok, err = stub.ReplaceRow("RBAC", shim.Row{ Columns: []*shim.Column{ &shim.Column{Value: &shim.Column_Bytes{Bytes: id}}, &shim.Column{Value: &shim.Column_String_{String_: row.Columns[1].GetString_() + " " + role}}, }, }) if err != nil { return nil, fmt.Errorf("Failed replacing row [%s]", err) } if !ok { return nil, errors.New("Failed replacing row.") } } return nil, err }