Initial commit

parents
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/chaincode.iml" filepath="$PROJECT_DIR$/.idea/chaincode.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GOROOT" path="/usr/local/go" />
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="120" />
<option name="y" value="27" />
<option name="width" value="1657" />
<option name="height" value="861" />
</component>
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="go.gopath.indexing.explicitly.defined" value="true" />
<property name="go.import.settings.migrated" value="true" />
<property name="go.sdk.automatically.set" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
</component>
<component name="RunManager">
<configuration name="TestGXHCC in github.com/hyperledger/chaincode/gongxianghui" type="GoTestRunConfiguration" factoryName="Go Test" temporary="true" nameIsGenerated="true">
<module name="chaincode" />
<working_directory value="$PROJECT_DIR$/gongxianghui" />
<framework value="gotest" />
<kind value="PACKAGE" />
<package value="github.com/hyperledger/chaincode/gongxianghui" />
<directory value="$PROJECT_DIR$/" />
<filePath value="$PROJECT_DIR$/" />
<pattern value="^TestGXHCC$" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Go Test.TestGXHCC in github.com/hyperledger/chaincode/gongxianghui" />
</list>
</recent_temporary>
</component>
</project>
\ No newline at end of file
package main
import (
"encoding/json"
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
)
/*
put
args 字段说明:
1:args[0]代表我们具体操作的表,
2:args[1:]后面的数据表示要记录到数据库的数据,每一个string 必须是json字符串,并且需要每一个json 字符串都必须包含id 字段
*/
func put(args []string, stub shim.ChaincodeStubInterface) (string, error) {
if len(args) < 2 {
return "", fmt.Errorf("Expected more than 2 parameters to function put!")
}
var mapResult map[string]interface{}
var schemaMap map[string]interface{}
schema := &Schema{}
result, err := schema.get(args[0], stub)
if err != nil {
return "", err
}
json.Unmarshal([]byte(result),&schemaMap)
for k, v := range args[1:] {
if err := json.Unmarshal([]byte(v), &mapResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,args index %d string not json string, err:%s", k, err)
}
Id ,ok:= mapResult["id"]
if !ok{
return "", fmt.Errorf("The id field must exist ")
}
if result,err := stub.GetState(args[0]+Id.(string));err!=nil{
return "", fmt.Errorf("get %s data happen err: ", args[0]+Id.(string))
}else if result!=nil{
return "", fmt.Errorf("%s data already exist", args[0]+Id.(string))
}
if !SchemaCheck(schemaMap,mapResult){
return "", fmt.Errorf("SchemaCheck fail,args index %d string doesn't match %s format", k,args[0])
}
putDate,_:=json.Marshal(mapResult)
if err := stub.PutState(args[0]+Id.(string), putDate); err != nil {
return "", fmt.Errorf("PutState fail, err :%s", err)
}
}
return fmt.Sprintf("%s put data success!", args[0]), nil
}
/*
修改一个表的一条数据的一个或者多个字段值
*/
func update(args []string, stub shim.ChaincodeStubInterface) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("Expected 2 parameters to function put! ")
}
var mapResult map[string]interface{}
var allMap map[string]interface{}
if err := json.Unmarshal([]byte(args[1]), &mapResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,args index %d string not json string,err: ", err)
}
Id ,ok:= mapResult["id"]
if !ok{
return "", fmt.Errorf("The id field must exist ")
}
result, err := stub.GetState(args[0] + Id.(string))
if err != nil || result == nil {
return "", fmt.Errorf("GetState data fail,please check your parameters ")
}
if err := json.Unmarshal(result, &allMap); err != nil {
return "", fmt.Errorf("result parameters Unmarshal fail err:%s ", err)
}
if err := Deassign(mapResult, allMap); err != nil {
return "", err
} else {
resultByte, _:= json.Marshal(mapResult)
if err := stub.PutState(args[0]+Id.(string), resultByte);err!=nil{
return "", fmt.Errorf("updateState date fail, err :%s ", err)
}
return fmt.Sprintf("%s update data success!", args[0]), nil
}
}
func get(args []string, stub shim.ChaincodeStubInterface) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("Expected 2 parameters to function put!")
}
var mapResult map[string]interface{}
if err := json.Unmarshal([]byte(args[1]), &mapResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,args index string not json string,err: %s", err)
}
Id := mapResult["id"]
Id ,ok:= mapResult["id"]
if !ok{
return "", fmt.Errorf("The id field must exist ")
}
result, err := stub.GetState(args[0] + Id.(string))
if err != nil || result == nil {
return "", fmt.Errorf("GetState data fail,please check your parameters ")
}
return string(result), nil
}
/*
重新赋值,并检查相应的格式是否正确
*/
func Deassign(upMap ,result map[string]interface{}) error {
if len(upMap) > len(result){
return fmt.Errorf("Deassign fail,paramters format doesn't match! ",)
}
for k, v := range upMap {
if resultV,ok := result[k];ok{
resultMap, resultok := resultV.(map[string]interface{})
if vMap, ok := v.(map[string]interface{});ok {
if resultok{
Deassign(vMap,resultMap)
}else{
return fmt.Errorf("Deassign fail, format doesn't match! ")
}
}else if !resultok{
result[k] = v
}
}else{
return fmt.Errorf("Deassign fail %s key nonentity ",k)
}
}
return nil
}
func SchemaCheck(schema, checkmap map[string]interface{}) bool {
if len(schema) != len(checkmap) {
return false
}
for k, v := range checkmap {
if schemaV, ok := schema[k]; !ok {
return false
} else {
if parameterS, ok := schemaV.(map[string]interface{}); ok {
if parameterC, ok := v.(map[string]interface{}); !ok {
return false
} else {
if !SchemaCheck(parameterS, parameterC) {
return false
}
}
}
}
}
return true
}
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
// EncCC example simple Chaincode implementation of a chaincode that uses encryption/signatures
type GXHCC struct {
}
// Init does nothing for this cc
func (t *GXHCC) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success([]byte("GXHCC init successful! "))
}
// Invoke for this chaincode exposes
func (t *GXHCC) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
// get arguments and transient
functionName, args := stub.GetFunctionAndParameters()
switch functionName {
case "authority":
case "schema":
res,err := SchemaProcess(args,stub)
if err!=nil{
return shim.Error(fmt.Sprintf("SchemaProcess function err: %s", err))
}
return shim.Success([]byte(res))
case "put":
res,err := put(args,stub)
if err!=nil{
return shim.Error(fmt.Sprintf("put function err: %s", err))
}
return shim.Success([]byte(res))
case "get":
res,err := get(args,stub)
if err!=nil{
return shim.Error(fmt.Sprintf("put function err: %s", err))
}
return shim.Success([]byte(res))
case "update":
res,err := update(args,stub)
if err!=nil{
return shim.Error(fmt.Sprintf("put function err: %s", err))
}
return shim.Success([]byte(res))
default:
return shim.Error(fmt.Sprintf("Unsupported function %s", functionName))
}
return shim.Success([]byte("GXHCC invoke successful "))
}
func main() {
err := shim.Start(&GXHCC{})
if err != nil {
fmt.Printf("Error starting EncCC chaincode: %s", err)
}
}
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"testing"
)
func TestGXHCC(t *testing.T) {
cc := new(GXHCC)
stub := shim.NewMockStub("GXHCC",cc)
response:= stub.MockInit("init",nil)
fmt.Println(string(response.Payload))
input := `{"aname":"alibusi","aname":"alibus","atype":"type","alinkman":"","aader":"aader","amob":"1234567890","backup":{"id":"1","aname":"alibusi","atype":"type","alinkman":"","aader":"aader","amob":"1234567890"}}`
responseByPut := stub.MockInvoke("invoke1",[][]byte{[]byte("put"), []byte("alibusi"),[]byte(input)})
fmt.Printf("Invoke status %d,message %s and payload %s\n",responseByPut.Status,responseByPut.Message,string(responseByPut.Payload))
responseByget := stub.MockInvoke("invoke1",[][]byte{[]byte("get"), []byte("alibusi"),[]byte(input)})
fmt.Printf("Invoke status %d,message %s and payload %s \n",responseByget.Status,responseByget.Message,string(responseByget.Payload))
return
input2 := `{"id":"1","aname":"aaa","atype":"aaa","alinkman":"cc","aader":"aader","amob":"1234567890","backup":{"id":"1","aname":"alibusi","atype":"type","alinkman":"aaa","aader":"aader","amob":"1234567890"}}`
responseByPut2 := stub.MockInvoke("invoke1",[][]byte{[]byte("put"), []byte("alibusi"),[]byte(input2)})
fmt.Printf("Invoke22 status %d,message %s and payload %s\n",responseByPut2.Status,responseByPut2.Message,string(responseByPut2.Payload))
responseByget2 := stub.MockInvoke("invoke1",[][]byte{[]byte("get"), []byte("alibusi"),[]byte(`{"id":"1"}`)})
fmt.Printf("Invoke22 status %d,message %s and payload %s",responseByget2.Status,responseByget2.Message,string(responseByget2.Payload))
}
func TestGXHSchema(t *testing.T){
cc := new(GXHCC)
stub := shim.NewMockStub("GXHCC",cc)
response:= stub.MockInit("init",nil)
fmt.Println("MockInit Payload: ",string(response.Payload))
input := `{"aname":"alibusi","aname":"alibus","atype":"type","alinkman":"","aader":"aader","amob":"1234567890","backup":{"id":"1","aname":"alibusi","atype":"type","alinkman":"","aader":"aader","amob":"1234567890"}}`
responseByPutschema := stub.MockInvoke("invoke1",[][]byte{[]byte("schema"), []byte("put"),[]byte("alibusi"),[]byte(input)})
fmt.Printf("Invoke status %d,message %s and payload %s\n",responseByPutschema.Status,responseByPutschema.Message,string(responseByPutschema.Payload))
responseByGet := stub.MockInvoke("invoke1",[][]byte{[]byte("schema"), []byte("get"),[]byte("alibusi")})
fmt.Printf("Invoke status %d,message %s and payload %s\n",responseByGet.Status,responseByGet.Message,string(responseByGet.Payload))
fmt.Println()
fmt.Println("========================================right input data============================================")
responseByPut := stub.MockInvoke("invoke1",[][]byte{[]byte("put"), []byte("alibusi"),[]byte(input)})
fmt.Printf("Invoke status %d,message %s and payload %s\n",responseByPut.Status,responseByPut.Message,string(responseByPut.Payload))
responseByget := stub.MockInvoke("invoke1",[][]byte{[]byte("get"), []byte("alibusi"),[]byte(`{"id":"1"}`)})
fmt.Printf("Invoke status %d,message %s and payload %s \n",responseByget.Status,responseByget.Message,string(responseByget.Payload))
inputfail := `{"id":"2","atype":"type","alinkman":"","aader":"aader","amob":"1234567890","backup":{"id":"1","aname":"alibusi","atype":"type","alinkman":"","aader":"aader","amob":"1234567890"}}`
fmt.Println()
fmt.Println("========================================fail input data============================================")
responseByPutfail := stub.MockInvoke("invoke1",[][]byte{[]byte("put"), []byte("alibusi"),[]byte(inputfail)})
fmt.Printf("Invoke status %d,message %s and payload %s\n",responseByPutfail.Status,responseByPutfail.Message,string(responseByPutfail.Payload))
responseBygetfail := stub.MockInvoke("invoke1",[][]byte{[]byte("get"), []byte("alibusi"),[]byte(`{"id":"1"}`)})
fmt.Printf("Invoke status %d,message %s and payload %s \n",responseBygetfail.Status,responseBygetfail.Message,string(responseBygetfail.Payload))
}
\ No newline at end of file
package main
import (
"encoding/json"
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
)
type Schema struct {
}
func SchemaProcess(args []string, stub shim.ChaincodeStubInterface)(string, error){
if len(args) < 2{
return "", fmt.Errorf("Expect features with 2 or more parameters to play! ")
}
schema := &Schema{}
switch args[0] {
case "put":
return schema.put(args[1:],stub)
case "update":
return schema.update(args[1:],stub)
case "get":
return schema.get(args[1],stub)
default:
return "",fmt.Errorf(fmt.Sprintf("Unsupported schema function of %s", args[0]))
}
}
/*
put
args 字段说明:
1:args[0]代表我们具体操作的表,
2:args[1:]后面的数据表示要记录到数据库的数据,每一个string 必须是json字符串,并且需要每一个json 字符串都必须包含id 字段
我们可以发现json字符串都被我们解析成了map[string]interface{}类型的map,其中key代表表模板的字段,interface可以是一个结构,我们当前将他看做我们表模板字段的初始值。
*/
func (this *Schema) put(args []string, stub shim.ChaincodeStubInterface) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("Expected 2 parameters to function put!")
}
var mapResult map[string]interface{}
if err := json.Unmarshal([]byte(args[1]), &mapResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,args string not json string,err: %s", err)
}else{
if extrastr,ok := mapResult["extra"];ok{
var extraResult map[string]interface{}
if err := json.Unmarshal([]byte(extrastr.(string)), &extraResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,extra string not json string,err: %s", err)
}
}
}
_ ,ok:= mapResult["id"]
if !ok{
return "", fmt.Errorf("The id field must exist ")
}
if value,_ :=stub.GetState(args[0]);value != nil{
return "", fmt.Errorf("the parameter %s already exists and cannot be added", args[0])
}
putDate,_:= json.Marshal(mapResult) //处理重复字段
if err := stub.PutState(args[0], putDate); err != nil {
return "", fmt.Errorf("PutState fail,err: %s", err)
}
return fmt.Sprintf("%s schema put success!",args[0]), nil
}
/*
if update Schema 那么我们没有办法比较旧有的一个模板,
TODO,增加版本管理
*/
func (this *Schema) update(args []string, stub shim.ChaincodeStubInterface) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("expected 2 parameters to function put!")
}
var mapResult map[string]interface{}
if err := json.Unmarshal([]byte(args[1]), &mapResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,args string not json string,err: %s", err)
}else{
if extrastr,ok := mapResult["extra"];ok{
var extraResult map[string]interface{}
if err := json.Unmarshal([]byte(extrastr.(string)), &extraResult); err != nil {
return "", fmt.Errorf("parameters Unmarshal fail,extra string not json string,err: %s", err)
}
}
}
_ ,ok:= mapResult["id"]
if !ok{
return "", fmt.Errorf("The id field must exist ")
}
result, err := stub.GetState(args[0])
if err != nil || result == nil {
return "", fmt.Errorf("GetSchema data fail,please check your parameters ")
}
err = stub.PutState(args[0], []byte(args[1]))
return fmt.Sprintf("%s schema update success!",args[0]), err
}
func (this *Schema) get(args string, stub shim.ChaincodeStubInterface) (string, error) {
result, err := stub.GetState(args)
if err != nil || result == nil {
return "", fmt.Errorf("GetSchema data fail,please check your parameters ")
}
return string(result), nil
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment