339 lines
7.7 KiB
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)
|
|
}
|