sample_chain/peer/shim/smallbank.go

339 lines
7.7 KiB
Go

package shim
import (
"fmt"
pb "schain/proto"
"strconv"
)
type SmallBank struct{}
var BALANCE int = 100000
var savingTab string = "saving"
var checkingTab string = "checking"
func (s *SmallBank) Init(stub ChaincodeStubInterface) pb.Response {
for _, arg := range stub.GetArgs() {
fmt.Println(string(arg))
}
return Success(nil)
}
func (s *SmallBank) Invoke(stub ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
switch function {
case "setAccount":
return s.setAccount(stub, args)
case "almagate":
return s.almagate(stub, args)
case "getBalance":
return s.getBalance(stub, args)
case "updateBalance":
return s.updateBalance(stub, args)
case "updateSaving":
return s.updateSaving(stub, args)
case "sendPayment":
return s.sendPayment(stub, args)
case "writeCheck":
return s.writeCheck(stub, args)
default:
return Error(`Invalid invoke function name. Expecting "setAccount", "almagate", "getBalance", "updateSaving", "sendPayment" or "writeCheck"`)
}
}
func (s *SmallBank) setAccount(stub ChaincodeStubInterface, args []string) pb.Response {
var account string
var savingamount string
var checkingamount string
//var err error
if len(args) != 3 {
return Error("Incorrect number of arguments. Expecting name of the person to query")
}
account = args[0]
savingamount = args[1]
checkingamount = args[2]
err := stub.PutState(savingTab+"_"+account, []byte(savingamount))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + account + "\"}"
return Error(jsonResp)
}
err = stub.PutState(checkingTab+"_"+account, []byte(checkingamount))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + account + "\"}"
return Error(jsonResp)
}
return Success(nil)
}
func (s *SmallBank) almagate(stub ChaincodeStubInterface, args []string) pb.Response {
var from string
var to string
if len(args) != 2 {
return Error("Incorrect number of arguments. Expecting name of the person to almagate")
}
from = args[0]
to = args[1]
var bal1, bal2 int
var err error
bal_str1, err := stub.GetState(savingTab + "_" + from)
if err != nil {
bal_str1 = []byte(strconv.Itoa(BALANCE))
}
bal_str2, err := stub.GetState(checkingTab + "_" + to)
if err != nil {
bal_str2 = []byte(strconv.Itoa(BALANCE))
}
bal1, err = strconv.Atoi(string(bal_str1))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(string(bal_str2))
if err != nil {
bal2 = BALANCE
}
bal1 += bal2
err = stub.PutState(checkingTab+"_"+from, []byte("0"))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + from + "\"}"
return Error(jsonResp)
}
err = stub.PutState(savingTab+"_"+to, []byte(strconv.Itoa(bal1)))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + to + "\"}"
return Error(jsonResp)
}
return Success(nil)
}
func (s *SmallBank) getBalance(stub ChaincodeStubInterface, args []string) pb.Response {
var account string
if len(args) != 1 {
return Error("Incorrect number of arguments. Expecting name of the person to getBalance")
}
account = args[0]
var bal1, bal2 int
var err error
bal_str1, err := stub.GetState(savingTab + "_" + account)
if err != nil {
bal_str1 = []byte(strconv.Itoa(BALANCE))
}
bal_str2, err := stub.GetState(checkingTab + "_" + account)
if err != nil {
bal_str2 = []byte(strconv.Itoa(BALANCE))
}
bal1, err = strconv.Atoi(string(bal_str1))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(string(bal_str2))
if err != nil {
bal2 = BALANCE
}
bal1 += bal2
//jsonResp := "{\"Key\":\"" + account + "\",\"Value\":\"" + strconv.Itoa(bal1) + "\"}"
//fmt.Printf("GetBalance Response:%s\n", jsonResp)
return Success(nil)
}
func (s *SmallBank) updateBalance(stub ChaincodeStubInterface, args []string) pb.Response {
var account string
var amountArg string
if len(args) != 2 {
return Error("Incorrect number of arguments. Expecting name of the person to updateBalance")
}
account = args[0]
amountArg = args[1]
bal_str, err2 := stub.GetState(checkingTab + "_" + account)
if err2 != nil {
bal_str = []byte(strconv.Itoa(BALANCE))
}
var bal1, bal2 int
var err error
bal1, err = strconv.Atoi(string(bal_str))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(amountArg)
if err != nil {
jsonResp := "{\"Error\":\"Failed to get Balance for " + account + "\"}"
return Error(jsonResp)
}
bal1 += bal2
err = stub.PutState(checkingTab+"_"+account, []byte(strconv.Itoa(bal1)))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + account + "\"}"
return Error(jsonResp)
}
return Success(nil)
}
func (s *SmallBank) updateSaving(stub ChaincodeStubInterface, args []string) pb.Response {
var account string
var amountArg string
if len(args) != 2 {
return Error("Incorrect number of arguments. Expecting name of the person to updateSaving")
}
account = args[0]
amountArg = args[1]
bal_str3, err3 := stub.GetState(savingTab + "_" + account)
if err3 != nil {
bal_str3 = []byte(strconv.Itoa(BALANCE))
}
var bal1, bal2 int
var err error
bal1, err = strconv.Atoi(string(bal_str3))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(amountArg)
if err != nil {
jsonResp := "{\"Error\":\"Failed to get Balance for " + account + "\"}"
return Error(jsonResp)
}
bal1 += bal2
err = stub.PutState(savingTab+"_"+account, []byte(strconv.Itoa(bal1)))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + account + "\"}"
return Error(jsonResp)
}
return Success(nil)
}
func (s *SmallBank) sendPayment(stub ChaincodeStubInterface, args []string) pb.Response {
var from string
var to string
var amountArg string
if len(args) != 3 {
return Error("Incorrect number of arguments. Expecting name of the person to sendPayment")
}
from = args[0]
to = args[1]
amountArg = args[2]
var bal1, bal2, amount int
var err error
bal_str1, err := stub.GetState(checkingTab + "_" + from)
if err != nil {
bal_str1 = []byte(strconv.Itoa(BALANCE))
}
bal_str2, err := stub.GetState(checkingTab + "_" + to)
if err != nil {
bal_str2 = []byte(strconv.Itoa(BALANCE))
}
amount, err = strconv.Atoi(amountArg)
bal1, err = strconv.Atoi(string(bal_str1))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(string(bal_str2))
if err != nil {
bal2 = BALANCE
}
bal1 -= amount
bal2 += amount
err = stub.PutState(checkingTab+"_"+from, []byte(strconv.Itoa(bal1)))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + to + "\"}"
return Error(jsonResp)
}
err = stub.PutState(checkingTab+"_"+to, []byte(strconv.Itoa(bal2)))
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state for " + to + "\"}"
return Error(jsonResp)
}
return Success(nil)
}
func (s *SmallBank) writeCheck(stub ChaincodeStubInterface, args []string) pb.Response {
var from string
var amountArg string
if len(args) != 2 {
return Error("Incorrect number of arguments. Expecting name of the person to writeCheck")
}
from = args[0]
amountArg = args[1]
bal_str2, err2 := stub.GetState(checkingTab + "_" + from)
if err2 != nil {
bal_str2 = []byte(strconv.Itoa(BALANCE))
}
bal_str3, err3 := stub.GetState(savingTab + "_" + from)
if err3 != nil {
bal_str3 = []byte(strconv.Itoa(BALANCE))
}
var bal1, bal2 int
var err error
var amount int
bal1, err = strconv.Atoi(string(bal_str2))
if err != nil {
bal1 = BALANCE
}
bal2, err = strconv.Atoi(string(bal_str3))
if err != nil {
bal2 = BALANCE
}
amount, err = strconv.Atoi(amountArg)
if amount < bal1+bal2 {
err = stub.PutState(checkingTab+"_"+from, []byte(strconv.Itoa(bal1-amount-1)))
} else {
err = stub.PutState(checkingTab+"_"+from, []byte(strconv.Itoa(bal1-amount)))
}
if err != nil {
jsonResp := "{\"Error\":\"Failed to put state " + "\"}"
return Error(jsonResp)
}
return Success(nil)
}