-
Notifications
You must be signed in to change notification settings - Fork 90
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature/solution skvs #766
base: main
Are you sure you want to change the base?
Changes from all commits
cc005e1
1c2e39c
ec65187
eafbf16
8fb8b84
6583c84
b14f71f
3e086dd
b29bcca
754f02d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/* | ||
Copyright IBM Corp. All Rights Reserved. | ||
|
||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package enclave_go | ||
|
||
import ( | ||
"github.com/hyperledger/fabric-chaincode-go/shim" | ||
pb "github.com/hyperledger/fabric-protos-go/peer" | ||
) | ||
|
||
func NewSkvsStub(cc shim.Chaincode) *EnclaveStub { | ||
logger.Warning("==== SKVS NewSkvsStub ====") | ||
enclaveStub := NewEnclaveStub(cc) | ||
enclaveStub.stubProvider = func(stub shim.ChaincodeStubInterface, input *pb.ChaincodeInput, rwset *readWriteSet, sep StateEncryptionFunctions) shim.ChaincodeStubInterface { | ||
return NewSkvsStubInterface(stub, input, rwset, sep) | ||
} | ||
return enclaveStub | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
/* | ||
Copyright IBM Corp. All Rights Reserved. | ||
|
||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package enclave_go | ||
|
||
import ( | ||
"encoding/json" | ||
|
||
"github.com/hyperledger/fabric-chaincode-go/shim" | ||
pb "github.com/hyperledger/fabric-protos-go/peer" | ||
"github.com/pkg/errors" | ||
) | ||
|
||
type SkvsStubInterface struct { | ||
*FpcStubInterface | ||
allDataOld map[string][]byte | ||
allDataNew map[string][]byte | ||
key string | ||
} | ||
|
||
func NewSkvsStubInterface(stub shim.ChaincodeStubInterface, input *pb.ChaincodeInput, rwset *readWriteSet, sep StateEncryptionFunctions) *SkvsStubInterface { | ||
logger.Warning("==== Get New Skvs Interface =====") | ||
fpcStub := NewFpcStubInterface(stub, input, rwset, sep) | ||
skvsStub := SkvsStubInterface{fpcStub, map[string][]byte{}, map[string][]byte{}, "SKVS"} | ||
err := skvsStub.InitSKVS() | ||
if err != nil { | ||
logger.Warningf("Error!! Initializing SKVS failed") | ||
} | ||
return &skvsStub | ||
} | ||
|
||
func (s *SkvsStubInterface) InitSKVS() error { | ||
logger.Warningf(" === Initializing SKVS === ") | ||
|
||
// get current state, this will only operate once | ||
encValue, err := s.GetPublicState(s.key) | ||
if err != nil { | ||
return nil | ||
} | ||
|
||
if len(encValue) == 0 { | ||
logger.Warningf("SKVS is empty, Initiating.") | ||
} else { | ||
value, err := s.sep.DecryptState(encValue) | ||
if err != nil { | ||
return err | ||
} | ||
logger.Warningf("SKVS has default value, loading current value.") | ||
|
||
err = json.Unmarshal(value, &s.allDataOld) | ||
if err != nil { | ||
logger.Errorf("SKVS Json unmarshal error: %s", err) | ||
return err | ||
} | ||
err = json.Unmarshal(value, &s.allDataNew) | ||
if err != nil { | ||
logger.Errorf("SKVS Json unmarshal error: %s", err) | ||
return err | ||
} | ||
} | ||
|
||
logger.Warningf("SKVS Init finish, allDataOld: %s, allDataNew: %s", s.allDataOld, s.allDataNew) | ||
return nil | ||
} | ||
|
||
func (s *SkvsStubInterface) GetState(key string) ([]byte, error) { | ||
logger.Warningf("Calling Get State (Start), key: %s, alldataOld: %s", key, s.allDataOld) | ||
value, found := s.allDataOld[key] | ||
if !found { | ||
return nil, errors.New("skvs allDataOld key not found") | ||
} | ||
logger.Warningf("Calling Get State (End), key: %s, value: %x", key, value) | ||
return value, nil | ||
} | ||
|
||
func (s *SkvsStubInterface) PutState(key string, value []byte) error { | ||
logger.Warningf("Calling Put State (Start), key: %s, value: %x, alldata: %s", key, value, s.allDataNew) | ||
|
||
s.allDataNew[key] = value | ||
byteAllData, err := json.Marshal(s.allDataNew) | ||
if err != nil { | ||
return err | ||
} | ||
encValue, err := s.sep.EncryptState(byteAllData) | ||
if err != nil { | ||
return err | ||
} | ||
logger.Warningf("Calling Put State (End), put encValue: %x", encValue) | ||
|
||
return s.PutPublicState(s.key, encValue) | ||
} | ||
|
||
func (s *SkvsStubInterface) DelState(key string) error { | ||
delete(s.allDataNew, key) | ||
byteAllData, err := json.Marshal(s.allDataNew) | ||
if err != nil { | ||
return err | ||
} | ||
encValue, err := s.sep.EncryptState(byteAllData) | ||
if err != nil { | ||
return err | ||
} | ||
return s.PutPublicState(s.key, encValue) | ||
} | ||
|
||
func (s *SkvsStubInterface) GetStateByRange(startKey string, endKey string) (shim.StateQueryIteratorInterface, error) { | ||
panic("not implemented") // TODO: Implement | ||
} | ||
|
||
func (s *SkvsStubInterface) GetStateByRangeWithPagination(startKey string, endKey string, pageSize int32, bookmark string) (shim.StateQueryIteratorInterface, *pb.QueryResponseMetadata, error) { | ||
panic("not implemented") // TODO: Implement | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* | ||
Copyright IBM Corp. All Rights Reserved. | ||
|
||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package chaincode | ||
|
||
import ( | ||
"github.com/hyperledger/fabric-chaincode-go/shim" | ||
"github.com/hyperledger/fabric-private-chaincode/ecc/chaincode" | ||
"github.com/hyperledger/fabric-private-chaincode/ecc/chaincode/ercc" | ||
"github.com/hyperledger/fabric-private-chaincode/ecc_go/chaincode/enclave_go" | ||
"github.com/hyperledger/fabric-private-chaincode/internal/endorsement" | ||
"github.com/hyperledger/fabric/common/flogging" | ||
) | ||
|
||
var logger = flogging.MustGetLogger("enclave_go") | ||
|
||
func NewSkvsChaincode(cc shim.Chaincode) *chaincode.EnclaveChaincode { | ||
logger.Info("Creating new SKVS Chaincode") | ||
ecc := &chaincode.EnclaveChaincode{ | ||
Enclave: enclave_go.NewSkvsStub(cc), | ||
Validator: endorsement.NewValidator(), | ||
Extractor: &chaincode.ExtractorImpl{}, | ||
Ercc: &ercc.StubImpl{}, | ||
} | ||
return ecc | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,13 @@ | |
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
TOP = ../../.. | ||
include $(TOP)/ecc_go/build.mk | ||
|
||
CC_NAME ?= fpc-secret-keeper-go | ||
|
||
# Define paths for cmd subdirectories | ||
DEFAULT= cmd/naive/main.go | ||
SKVS_PATH = cmd/skvs/main.go | ||
|
||
MAIN_GO_PATH ?=$(DEFAULT) | ||
|
||
include $(TOP)/ecc_go/build.mk | ||
Comment on lines
+11
to
+16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should add a small section in the readme of this demo to explain how to build the chaincode with these different options. For example:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is nothing else the user need to change in order to use skvs, right? |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/* | ||
Copyright IBM Corp. All Rights Reserved. | ||
Copyright 2020 Intel Corporation | ||
|
||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package main | ||
|
||
import ( | ||
"os" | ||
|
||
"github.com/hyperledger/fabric-chaincode-go/shim" | ||
"github.com/hyperledger/fabric-contract-api-go/contractapi" | ||
fpc "github.com/hyperledger/fabric-private-chaincode/ecc_go/chaincode" | ||
"github.com/hyperledger/fabric-private-chaincode/samples/chaincode/secret-keeper-go/chaincode" | ||
) | ||
|
||
func main() { | ||
|
||
ccid := os.Getenv("CHAINCODE_PKG_ID") | ||
addr := os.Getenv("CHAINCODE_SERVER_ADDRESS") | ||
|
||
// create chaincode | ||
secretChaincode, _ := contractapi.NewChaincode(&chaincode.SecretKeeper{}) | ||
// chaincode := fpc.NewPrivateChaincode(secretChaincode) | ||
skvsChaincode := fpc.NewSkvsChaincode(secretChaincode) | ||
|
||
// start chaincode as a service | ||
server := &shim.ChaincodeServer{ | ||
CCID: ccid, | ||
Address: addr, | ||
CC: skvsChaincode, | ||
TLSProps: shim.TLSProperties{ | ||
Disabled: true, // just for testing good enough | ||
}, | ||
} | ||
|
||
if err := server.Start(); err != nil { | ||
panic(err) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am wondering if it would be better to add an option to the
NewPrivateChaincode
method to instantiate the with SKVS rather than creating this new constructor.It could look like ...
and in the chaincode
main.go
, the developer would write something like that ...See this article https://golang.cafe/blog/golang-functional-options-pattern.html
WDYT?