mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
Json Validation Function Tests on ChainCode
This commit is contained in:
parent
cf36f096c5
commit
7d76f9b07a
10 changed files with 1012 additions and 74 deletions
|
|
@ -3,8 +3,8 @@ package chaincode
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
||||||
|
"github.com/xeipuuv/gojsonschema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SmartContract provides functions for managing an Asset
|
// SmartContract provides functions for managing an Asset
|
||||||
|
|
@ -15,7 +15,9 @@ type SmartContract struct {
|
||||||
// Asset describes basic details of what makes up a simple asset
|
// Asset describes basic details of what makes up a simple asset
|
||||||
// Insert struct field in alphabetic order => to achieve determinism across languages
|
// Insert struct field in alphabetic order => to achieve determinism across languages
|
||||||
// golang keeps the order when marshal to json but doesn't order automatically
|
// golang keeps the order when marshal to json but doesn't order automatically
|
||||||
type Data struct {
|
|
||||||
|
|
||||||
|
/*type Data struct {
|
||||||
docType string `json:"docType"`
|
docType string `json:"docType"`
|
||||||
id string `json:"id"`
|
id string `json:"id"`
|
||||||
title string `json:"title"`
|
title string `json:"title"`
|
||||||
|
|
@ -33,12 +35,25 @@ type Data struct {
|
||||||
noteForChange string `json:"noteForChange"`
|
noteForChange string `json:"noteForChange"`
|
||||||
contributor string `json:"contributor"`
|
contributor string `json:"contributor"`
|
||||||
contributor_id string `json:"contributor_id"`
|
contributor_id string `json:"contributor_id"`
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
// Asset describes basic details of what makes up a simple asset
|
||||||
|
// Insert struct field in alphabetic order => to achieve determinism across languages
|
||||||
|
// golang keeps the order when marshal to json but doesn't order automatically
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Contributor string `json:"Contributor"`
|
||||||
|
ContributorId string `json:"ContributorId"`
|
||||||
|
ContentHash string `json:"ContentHash"`
|
||||||
|
Id string `json:"Id"`
|
||||||
|
Owners []string `json:"Owners"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitLedger adds a base set of Data entries to the ledger
|
// InitLedger adds a base set of Data entries to the ledger
|
||||||
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
|
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
|
||||||
dataEntries := []Data{
|
dataEntries := []Data{
|
||||||
{docType: "TestType", id: "00000", title: "TestSample", description: "description", Type: "TestType", DOI: "https://doi.org/10.57873/T34W2R", url: "sdsc.edu", manifest: "TestManifest", footprint: "", keywords: "SmartContrac, ChainCode, Peer", otherDataIdName: "None", otherDataIdValue: "None", fundingAgencies: "DOS", acknowledgment: "SDSC", noteForChange: "NONE", contributor: "AveryhardworkingUser@email.com", contributor_id: "ABC123"},
|
{Contributor: "pepitoperes@email.com", ContributorId: "ABC123", ContentHash: "ZXCVBNM", Id: "00000", Owners: []string{"CIA", "DEA", "FBI"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, data := range dataEntries {
|
for _, data := range dataEntries {
|
||||||
|
|
@ -47,7 +62,7 @@ func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ctx.GetStub().PutState(data.id, assetJSON)
|
err = ctx.GetStub().PutState(data.Id, assetJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to put to world state. %v", err)
|
return fmt.Errorf("failed to put to world state. %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -85,8 +100,8 @@ func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssetExists returns true when asset with given ID exists in world state
|
// AssetExists returns true when asset with given ID exists in world state
|
||||||
func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface, id string) (bool, error) {
|
func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface, Id string) (bool, error) {
|
||||||
assetJSON, err := ctx.GetStub().GetState(id)
|
assetJSON, err := ctx.GetStub().GetState(Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to read from world state: %v", err)
|
return false, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -94,109 +109,112 @@ func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface,
|
||||||
return assetJSON != nil, nil
|
return assetJSON != nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JSON Validation
|
||||||
|
|
||||||
|
func (s *SmartContract) validJson() (bool, error) {
|
||||||
|
|
||||||
|
schemaLoader := gojsonschema.NewReferenceLoader("file:///home/ofgarzon2662/OSC-IS/fabric-samples/test-network/JsonSchemaValidationTests/Schema.json")
|
||||||
|
documentLoader := gojsonschema.NewReferenceLoader("file:////home/ofgarzon2662/OSC-IS/fabric-samples/test-network/JsonSchemaValidationTests/testFile.json")
|
||||||
|
|
||||||
|
result, err := gojsonschema.Validate(schemaLoader, documentLoader)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Valid() {
|
||||||
|
fmt.Printf("The document is valid\n")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("The document is not valid. see errors :\n")
|
||||||
|
for _, desc := range result.Errors() {
|
||||||
|
fmt.Printf("- %s\n", desc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.Valid(), nil
|
||||||
|
}
|
||||||
|
|
||||||
// CreateDataSample issues a new Data Sample to the world state with given details.
|
// CreateDataSample issues a new Data Sample to the world state with given details.
|
||||||
func (s *SmartContract) CreateDataSample(ctx contractapi.TransactionContextInterface,
|
func (s *SmartContract) CreateDataSample(ctx contractapi.TransactionContextInterface,
|
||||||
docType string, id string, title string, description string, Type string, DOI string,
|
Contributor string, ContributorId string, ContentHash string, Id string) error {
|
||||||
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
|
||||||
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
|
||||||
contributor string, contributor_id string) error {
|
|
||||||
|
|
||||||
exists, err := s.AssetExists(ctx, id)
|
exists, err := s.AssetExists(ctx, Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if exists {
|
if exists {
|
||||||
return fmt.Errorf("the asset %s already exists", id)
|
return fmt.Errorf("the asset %s already exists", Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//valid, err := s.validJson()
|
||||||
|
//if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
//if !valid {
|
||||||
|
// return fmt.Errorf("The Json file provided is not valid")
|
||||||
|
//} else {
|
||||||
data := Data{
|
data := Data{
|
||||||
docType: docType,
|
Contributor :Contributor,
|
||||||
id: id,
|
ContributorId :ContributorId,
|
||||||
title: title,
|
ContentHash :ContentHash,
|
||||||
description: description,
|
Id :Id,
|
||||||
Type: Type,
|
Owners :[]string{"DOE", "DOS", "DOJ"}}
|
||||||
DOI: DOI,
|
|
||||||
url: url,
|
|
||||||
manifest: manifest,
|
|
||||||
footprint: footprint,
|
|
||||||
keywords: keywords,
|
|
||||||
otherDataIdName: otherDataIdName,
|
|
||||||
otherDataIdValue: otherDataIdValue,
|
|
||||||
fundingAgencies: fundingAgencies,
|
|
||||||
acknowledgment: acknowledgment,
|
|
||||||
noteForChange: noteForChange,
|
|
||||||
contributor: contributor,
|
|
||||||
contributor_id: contributor_id,
|
|
||||||
}
|
|
||||||
assetJSON, err := json.Marshal(data)
|
assetJSON, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
return ctx.GetStub().PutState(Id, assetJSON)
|
||||||
return ctx.GetStub().PutState(id, assetJSON)
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateAsset updates an existing asset in the world state with provided parameters.
|
// UpdateAsset updates an existing asset in the world state with provided parameters.
|
||||||
func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
docType string, id string, title string, description string, Type string, DOI string,
|
Contributor string, ContributorId string, ContentHash string, Id string) error {
|
||||||
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
exists, err := s.AssetExists(ctx, Id)
|
||||||
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
|
||||||
contributor string, contributor_id string) error {
|
|
||||||
exists, err := s.AssetExists(ctx, id)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !exists {
|
if !exists {
|
||||||
return fmt.Errorf("the asset %s does not exist", id)
|
return fmt.Errorf("the asset %s does not exist", Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// overwriting original asset with new asset
|
// overwriting original asset with new asset
|
||||||
|
|
||||||
data := Data{
|
data := Data{
|
||||||
docType: docType,
|
Contributor :Contributor,
|
||||||
id: id,
|
ContributorId :ContributorId,
|
||||||
title: title,
|
ContentHash :ContentHash,
|
||||||
description: description,
|
Id :Id,
|
||||||
Type: Type,
|
Owners :[]string{"DOE", "DOS", "DOJ"},
|
||||||
DOI: DOI,
|
|
||||||
url: url,
|
|
||||||
manifest: manifest,
|
|
||||||
footprint: footprint,
|
|
||||||
keywords: keywords,
|
|
||||||
otherDataIdName: otherDataIdName,
|
|
||||||
otherDataIdValue: otherDataIdValue,
|
|
||||||
fundingAgencies: fundingAgencies,
|
|
||||||
acknowledgment: acknowledgment,
|
|
||||||
noteForChange: noteForChange,
|
|
||||||
contributor: contributor,
|
|
||||||
contributor_id: contributor_id,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assetJSON, err := json.Marshal(data)
|
assetJSON, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx.GetStub().PutState(id, assetJSON)
|
return ctx.GetStub().PutState(Id, assetJSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error {
|
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, Id string) error {
|
||||||
exists, err := s.AssetExists(ctx, id)
|
exists, err := s.AssetExists(ctx, Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !exists {
|
if !exists {
|
||||||
return fmt.Errorf("the asset %s does not exist", id)
|
return fmt.Errorf("the asset %s does not exist", Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx.GetStub().DelState(id)
|
return ctx.GetStub().DelState(Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Data, error) {
|
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, Id string) (*Data, error) {
|
||||||
assetJSON, err := ctx.GetStub().GetState(id)
|
assetJSON, err := ctx.GetStub().GetState(Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
}
|
}
|
||||||
if assetJSON == nil {
|
if assetJSON == nil {
|
||||||
return nil, fmt.Errorf("the asset %s does not exist", id)
|
return nil, fmt.Errorf("the asset %s does not exist", Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
var data Data
|
var data Data
|
||||||
|
|
@ -209,26 +227,25 @@ func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, i
|
||||||
}
|
}
|
||||||
|
|
||||||
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
||||||
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newContributor string, newContributorId string) (string, error) {
|
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, Id string, newOwners []string) ([]string, error) {
|
||||||
data, err := s.ReadAsset(ctx, id)
|
data, err := s.ReadAsset(ctx, Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return []string{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data.contributor = newContributor
|
data.Owners = newOwners
|
||||||
data.contributor_id = newContributorId
|
|
||||||
|
|
||||||
assetJSON, err := json.Marshal(data)
|
assetJSON, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return []string{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ctx.GetStub().PutState(id, assetJSON)
|
err = ctx.GetStub().PutState(Id, assetJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return []string{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.contributor, nil
|
return data.Owners, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
package chaincode
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SmartContract provides functions for managing an Asset
|
||||||
|
type SmartContract struct {
|
||||||
|
contractapi.Contract
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asset describes basic details of what makes up a simple asset
|
||||||
|
// Insert struct field in alphabetic order => to achieve determinism across languages
|
||||||
|
// golang keeps the order when marshal to json but doesn't order automatically
|
||||||
|
type Data struct {
|
||||||
|
docType string `json:"docType"`
|
||||||
|
id string `json:"id"`
|
||||||
|
title string `json:"title"`
|
||||||
|
description string `json:"description"`
|
||||||
|
Type string `json:"Type"`
|
||||||
|
DOI string `json:"DOI"`
|
||||||
|
url string `json:"url"`
|
||||||
|
manifest string `json:"manifest"`
|
||||||
|
footprint string `json:"footprint"`
|
||||||
|
keywords string `json:"keywords"`
|
||||||
|
otherDataIdName string `json:"otherDataIdName"`
|
||||||
|
otherDataIdValue string `json:"otherDataIdValue"`
|
||||||
|
fundingAgencies string `json:"fundingAgencies"`
|
||||||
|
acknowledgment string `json:"acknowledgment"`
|
||||||
|
noteForChange string `json:"noteForChange"`
|
||||||
|
contributor string `json:"contributor"`
|
||||||
|
contributor_id string `json:"contributor_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitLedger adds a base set of Data entries to the ledger
|
||||||
|
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
|
||||||
|
dataEntries := []Data{
|
||||||
|
{docType: "TestType", id: "00000", title: "TestSample", description: "description", Type: "TestType", DOI: "https://doi.org/10.57873/T34W2R", url: "sdsc.edu", manifest: "TestManifest", footprint: "", keywords: "SmartContrac, ChainCode, Peer", otherDataIdName: "None", otherDataIdValue: "None", fundingAgencies: "DOS", acknowledgment: "SDSC", noteForChange: "NONE", contributor: "AveryhardworkingUser@email.com", contributor_id: "ABC123"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, data := range dataEntries {
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(data.id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to put to world state. %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllAssets returns all assets found in world state
|
||||||
|
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Data, error) {
|
||||||
|
// range query with empty string for startKey and endKey does an
|
||||||
|
// open-ended query of all assets in the chaincode namespace.
|
||||||
|
resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resultsIterator.Close()
|
||||||
|
|
||||||
|
var dataSamples []*Data
|
||||||
|
for resultsIterator.HasNext() {
|
||||||
|
queryResponse, err := resultsIterator.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var data Data
|
||||||
|
err = json.Unmarshal(queryResponse.Value, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dataSamples = append(dataSamples, &data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataSamples, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssetExists returns true when asset with given ID exists in world state
|
||||||
|
func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface, id string) (bool, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return assetJSON != nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDataSample issues a new Data Sample to the world state with given details.
|
||||||
|
func (s *SmartContract) CreateDataSample(ctx contractapi.TransactionContextInterface,
|
||||||
|
docType string, id string, title string, description string, Type string, DOI string,
|
||||||
|
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
||||||
|
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
||||||
|
contributor string, contributor_id string) error {
|
||||||
|
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if exists {
|
||||||
|
return fmt.Errorf("the asset %s already exists", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := Data{
|
||||||
|
docType: docType,
|
||||||
|
id: id,
|
||||||
|
title: title,
|
||||||
|
description: description,
|
||||||
|
Type: Type,
|
||||||
|
DOI: DOI,
|
||||||
|
url: url,
|
||||||
|
manifest: manifest,
|
||||||
|
footprint: footprint,
|
||||||
|
keywords: keywords,
|
||||||
|
otherDataIdName: otherDataIdName,
|
||||||
|
otherDataIdValue: otherDataIdValue,
|
||||||
|
fundingAgencies: fundingAgencies,
|
||||||
|
acknowledgment: acknowledgment,
|
||||||
|
noteForChange: noteForChange,
|
||||||
|
contributor: contributor,
|
||||||
|
contributor_id: contributor_id,
|
||||||
|
}
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateAsset updates an existing asset in the world state with provided parameters.
|
||||||
|
func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
|
docType string, id string, title string, description string, Type string, DOI string,
|
||||||
|
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
||||||
|
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
||||||
|
contributor string, contributor_id string) error {
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// overwriting original asset with new asset
|
||||||
|
data := Data{
|
||||||
|
docType: docType,
|
||||||
|
id: id,
|
||||||
|
title: title,
|
||||||
|
description: description,
|
||||||
|
Type: Type,
|
||||||
|
DOI: DOI,
|
||||||
|
url: url,
|
||||||
|
manifest: manifest,
|
||||||
|
footprint: footprint,
|
||||||
|
keywords: keywords,
|
||||||
|
otherDataIdName: otherDataIdName,
|
||||||
|
otherDataIdValue: otherDataIdValue,
|
||||||
|
fundingAgencies: fundingAgencies,
|
||||||
|
acknowledgment: acknowledgment,
|
||||||
|
noteForChange: noteForChange,
|
||||||
|
contributor: contributor,
|
||||||
|
contributor_id: contributor_id,
|
||||||
|
}
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error {
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().DelState(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Data, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
if assetJSON == nil {
|
||||||
|
return nil, fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
var data Data
|
||||||
|
err = json.Unmarshal(assetJSON, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
||||||
|
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newContributor string, newContributorId string) (string, error) {
|
||||||
|
data, err := s.ReadAsset(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
data.contributor = newContributor
|
||||||
|
data.contributor_id = newContributorId
|
||||||
|
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.contributor, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
// ReadAsset returns the asset stored in the world state with given id.
|
||||||
|
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Asset, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
if assetJSON == nil {
|
||||||
|
return nil, fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
var asset Asset
|
||||||
|
err = json.Unmarshal(assetJSON, &asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &asset, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
||||||
|
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newOwner string) (string, error) {
|
||||||
|
asset, err := s.ReadAsset(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
oldOwner := asset.Owner
|
||||||
|
asset.Owner = newOwner
|
||||||
|
|
||||||
|
assetJSON, err := json.Marshal(asset)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return oldOwner, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllAssets returns all assets found in world state
|
||||||
|
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Asset, error) {
|
||||||
|
// range query with empty string for startKey and endKey does an
|
||||||
|
// open-ended query of all assets in the chaincode namespace.
|
||||||
|
resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resultsIterator.Close()
|
||||||
|
|
||||||
|
var assets []*Asset
|
||||||
|
for resultsIterator.HasNext() {
|
||||||
|
queryResponse, err := resultsIterator.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var asset Asset
|
||||||
|
err = json.Unmarshal(queryResponse.Value, &asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
assets = append(assets, &asset)
|
||||||
|
}
|
||||||
|
|
||||||
|
return assets, nil
|
||||||
|
}
|
||||||
|
*/
|
||||||
52
test-network/JsonSchemaValidationTests/OSC-IS-DataSample.json
Executable file
52
test-network/JsonSchemaValidationTests/OSC-IS-DataSample.json
Executable file
|
|
@ -0,0 +1,52 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"contributor": "stillsame2016@gmail.com",
|
||||||
|
"contributor_id": "serverA_users_3074021",
|
||||||
|
"description": "In an effort to keep the maps current, the CGS has been compiling a new series of Regional Geologic Maps (RGM), starting in 1981. The new maps cover the same areas as the older Geologic Atlas of Arizona, but show more detail and use geologic formations rather than the simplified geologic time-based units.",
|
||||||
|
"docType": "org.osc.Data",
|
||||||
|
"footprint": "6Uznnp1ihszFdOn0I5mF/tWZKQ3xY5xm8rGAcfaZNPg=",
|
||||||
|
"fundingAgencies": ["NASA"],
|
||||||
|
"id": "osc-c1865f4c-05b1-4da7-93dc-d2e9ddc72d8e",
|
||||||
|
"keywords": "geologic map",
|
||||||
|
"manifest": [
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.dbf",
|
||||||
|
"hash": "0836628beb8f7df9e241d4a3ca990a20eec5d1a964824e64e8748bf17f0c76cd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.prj",
|
||||||
|
"hash": "7e6d48de4af1034b12b3fdd80946a77e9f6c7c26b840fa383e000b1f5b9786d8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.sbn",
|
||||||
|
"hash": "18cdce0ae7cc108dc0321e02555cfb7baaef3c6435fe797bf6a82d991767858c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.sbx",
|
||||||
|
"hash": "af51cccd6e08decea0ac26a0aefd1c9644bc27458062cb66d5fdfedeb92d2661"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.shp",
|
||||||
|
"hash": "96ffebc40a3632bbe98035ca095a6d10c46d1be9bab6471757a39492128d48ef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.shp.xml",
|
||||||
|
"hash": "14a596504330c2e511ebb3490ec684f4af2920a56ac3819e392bd3066a1f7d1c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"algorithm": "sha256",
|
||||||
|
"filename": "data_1_arizona_geologic_map/azgeol_arc_dd.shx",
|
||||||
|
"hash": "20b04563116894db331a4823d3726324fb4bec97e414e00143ac4fef7df8f41f"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"otherDataIdName": "None",
|
||||||
|
"title": "Arizona Geological Map",
|
||||||
|
"url": "http://www.sdsc.edu"
|
||||||
|
}
|
||||||
|
]
|
||||||
10
test-network/JsonSchemaValidationTests/Schema.json
Executable file
10
test-network/JsonSchemaValidationTests/Schema.json
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"number": { "type": "number" },
|
||||||
|
"street_name": { "type": "string" },
|
||||||
|
"street_type": { "enum": ["Street", "Avenue", "Boulevard"] }
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [ "number", "street_name"]
|
||||||
|
}
|
||||||
11
test-network/JsonSchemaValidationTests/go.mod
Executable file
11
test-network/JsonSchemaValidationTests/go.mod
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
|
||||||
|
|
||||||
|
go 1.14
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/golang/protobuf v1.3.2
|
||||||
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
|
||||||
|
github.com/hyperledger/fabric-contract-api-go v1.1.0
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e
|
||||||
|
github.com/stretchr/testify v1.5.1
|
||||||
|
)
|
||||||
145
test-network/JsonSchemaValidationTests/go.sum
Executable file
145
test-network/JsonSchemaValidationTests/go.sum
Executable file
|
|
@ -0,0 +1,145 @@
|
||||||
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
|
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||||
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||||
|
github.com/cucumber/godog v0.8.0/go.mod h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
|
github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
|
||||||
|
github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||||
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
|
||||||
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU=
|
||||||
|
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||||
|
github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs=
|
||||||
|
github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4=
|
||||||
|
github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q=
|
||||||
|
github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg=
|
||||||
|
github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=
|
||||||
|
github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212 h1:1i4lnpV8BDgKOLi1hgElfBqdHXjXieSuj8629mwBZ8o=
|
||||||
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc=
|
||||||
|
github.com/hyperledger/fabric-contract-api-go v1.1.0 h1:K9uucl/6eX3NF0/b+CGIiO1IPm1VYQxBkpnVGJur2S4=
|
||||||
|
github.com/hyperledger/fabric-contract-api-go v1.1.0/go.mod h1:nHWt0B45fK53owcFpLtAe8DH0Q5P068mnzkNXMPSL7E=
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e h1:9PS5iezHk/j7XriSlNuSQILyCOfcZ9wZ3/PiucmSE8E=
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
|
||||||
|
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||||
|
github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
||||||
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
|
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||||
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ=
|
||||||
|
golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw=
|
||||||
|
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
74
test-network/JsonSchemaValidationTests/jsonValidatorSchema.go
Executable file
74
test-network/JsonSchemaValidationTests/jsonValidatorSchema.go
Executable file
|
|
@ -0,0 +1,74 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/xeipuuv/gojsonschema"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
DocType string `json:"docType"`
|
||||||
|
Id string `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Type string `json:"Type"`
|
||||||
|
DOI string `json:"DOI"`
|
||||||
|
Url string `json:"url"`
|
||||||
|
Manifest []string `json:"manifest"`
|
||||||
|
Footprint string `json:"footprint"`
|
||||||
|
Keywords []string `json:"keywords"`
|
||||||
|
OtherDataIdName string `json:"otherDataIdName"`
|
||||||
|
OtherDataIdValue string `json:"otherDataIdValue"`
|
||||||
|
FundingAgencies []string `json:"fundingAgencies"`
|
||||||
|
Acknowledgment string `json:"acknowledgment"`
|
||||||
|
NoteForChange string `json:"noteForChange"`
|
||||||
|
Contributor string `json:"contributor"`
|
||||||
|
Contributor_id string `json:"contributor_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
|
||||||
|
dataEntries := []Data{
|
||||||
|
{docType: "TestType", id: "00000", title: "TestSample", description: "description", Type: "TestType", DOI: "https://doi.org/10.57873/T34W2R", url: "sdsc.edu", manifest: "TestManifest", footprint: "", keywords: "SmartContrac, ChainCode, Peer", otherDataIdName: "None", otherDataIdValue: "None", fundingAgencies: "DOS", acknowledgment: "SDSC", noteForChange: "NONE", contributor: "AveryhardworkingUser@email.com", contributor_id: "ABC123"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, data := range dataEntries {
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(data.id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to put to world state. %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//data := Data{
|
||||||
|
//"DocType": "TestType", "Id": "00000", "Title": "TestSample", "Description": "description", "Type": "TestType", "DOI": "https://doi.org/10.57873/T34W2R", "Url": "sdsc.edu", "Manifest": "TestManifest", "Footprint": "", "Keywords": '["SmartContrac", "ChainCode", "Peer"]'ß, "OtherDataIdName": "None", "OtherDataIdValue": "None", "FundingAgencies": ["DOS", "NASA"], "Acknowledgment": "SDSC", "NoteForChange": "NONE", "Contributor": "AveryhardworkingUser@email.com", "Contributor_id": "ABC123"
|
||||||
|
//}
|
||||||
|
|
||||||
|
schemaLoader := gojsonschema.NewReferenceLoader("file:///home/ofgarzon2662/OSC-IS/fabric-samples/test-network/JsonSchemaValidationTests/Schema.json")
|
||||||
|
documentLoader := gojsonschema.NewReferenceLoader("file:////home/ofgarzon2662/OSC-IS/fabric-samples/test-network/JsonSchemaValidationTests/testFile.json")
|
||||||
|
|
||||||
|
result, err := gojsonschema.Validate(schemaLoader, documentLoader)
|
||||||
|
//fmt.Printf(result.Valid())
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Valid() {
|
||||||
|
fmt.Printf("The document is valid\n")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("The document is not valid. see errors :\n")
|
||||||
|
for _, desc := range result.Errors() {
|
||||||
|
fmt.Printf("- %s\n", desc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
308
test-network/JsonSchemaValidationTests/smartcontract.go
Executable file
308
test-network/JsonSchemaValidationTests/smartcontract.go
Executable file
|
|
@ -0,0 +1,308 @@
|
||||||
|
package chaincode
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SmartContract provides functions for managing an Asset
|
||||||
|
type SmartContract struct {
|
||||||
|
contractapi.Contract
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asset describes basic details of what makes up a simple asset
|
||||||
|
// Insert struct field in alphabetic order => to achieve determinism across languages
|
||||||
|
// golang keeps the order when marshal to json but doesn't order automatically
|
||||||
|
type Data struct {
|
||||||
|
docType string `json:"docType"`
|
||||||
|
id string `json:"id"`
|
||||||
|
title string `json:"title"`
|
||||||
|
description string `json:"description"`
|
||||||
|
Type string `json:"Type"`
|
||||||
|
DOI string `json:"DOI"`
|
||||||
|
url string `json:"url"`
|
||||||
|
manifest string `json:"manifest"`
|
||||||
|
footprint string `json:"footprint"`
|
||||||
|
keywords string `json:"keywords"`
|
||||||
|
otherDataIdName string `json:"otherDataIdName"`
|
||||||
|
otherDataIdValue string `json:"otherDataIdValue"`
|
||||||
|
fundingAgencies string `json:"fundingAgencies"`
|
||||||
|
acknowledgment string `json:"acknowledgment"`
|
||||||
|
noteForChange string `json:"noteForChange"`
|
||||||
|
contributor string `json:"contributor"`
|
||||||
|
contributor_id string `json:"contributor_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitLedger adds a base set of Data entries to the ledger
|
||||||
|
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
|
||||||
|
dataEntries := []Data{
|
||||||
|
{docType: "TestType", id: "00000", title: "TestSample", description: "description", Type: "TestType", DOI: "https://doi.org/10.57873/T34W2R", url: "sdsc.edu", manifest: "TestManifest", footprint: "", keywords: "SmartContrac, ChainCode, Peer", otherDataIdName: "None", otherDataIdValue: "None", fundingAgencies: "DOS", acknowledgment: "SDSC", noteForChange: "NONE", contributor: "AveryhardworkingUser@email.com", contributor_id: "ABC123"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, data := range dataEntries {
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(data.id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to put to world state. %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllAssets returns all assets found in world state
|
||||||
|
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Data, error) {
|
||||||
|
// range query with empty string for startKey and endKey does an
|
||||||
|
// open-ended query of all assets in the chaincode namespace.
|
||||||
|
resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resultsIterator.Close()
|
||||||
|
|
||||||
|
var dataSamples []*Data
|
||||||
|
for resultsIterator.HasNext() {
|
||||||
|
queryResponse, err := resultsIterator.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var data Data
|
||||||
|
err = json.Unmarshal(queryResponse.Value, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dataSamples = append(dataSamples, &data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataSamples, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssetExists returns true when asset with given ID exists in world state
|
||||||
|
func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface, id string) (bool, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return assetJSON != nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDataSample issues a new Data Sample to the world state with given details.
|
||||||
|
func (s *SmartContract) CreateDataSample(ctx contractapi.TransactionContextInterface,
|
||||||
|
docType string, id string, title string, description string, Type string, DOI string,
|
||||||
|
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
||||||
|
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
||||||
|
contributor string, contributor_id string) error {
|
||||||
|
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if exists {
|
||||||
|
return fmt.Errorf("the asset %s already exists", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := Data{
|
||||||
|
docType: docType,
|
||||||
|
id: id,
|
||||||
|
title: title,
|
||||||
|
description: description,
|
||||||
|
Type: Type,
|
||||||
|
DOI: DOI,
|
||||||
|
url: url,
|
||||||
|
manifest: manifest,
|
||||||
|
footprint: footprint,
|
||||||
|
keywords: keywords,
|
||||||
|
otherDataIdName: otherDataIdName,
|
||||||
|
otherDataIdValue: otherDataIdValue,
|
||||||
|
fundingAgencies: fundingAgencies,
|
||||||
|
acknowledgment: acknowledgment,
|
||||||
|
noteForChange: noteForChange,
|
||||||
|
contributor: contributor,
|
||||||
|
contributor_id: contributor_id,
|
||||||
|
}
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateAsset updates an existing asset in the world state with provided parameters.
|
||||||
|
func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
|
docType string, id string, title string, description string, Type string, DOI string,
|
||||||
|
url string, manifest string, footprint string, keywords string, otherDataIdName string,
|
||||||
|
otherDataIdValue, string, fundingAgencies string, acknowledgment string, noteForChange string,
|
||||||
|
contributor string, contributor_id string) error {
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// overwriting original asset with new asset
|
||||||
|
data := Data{
|
||||||
|
docType: docType,
|
||||||
|
id: id,
|
||||||
|
title: title,
|
||||||
|
description: description,
|
||||||
|
Type: Type,
|
||||||
|
DOI: DOI,
|
||||||
|
url: url,
|
||||||
|
manifest: manifest,
|
||||||
|
footprint: footprint,
|
||||||
|
keywords: keywords,
|
||||||
|
otherDataIdName: otherDataIdName,
|
||||||
|
otherDataIdValue: otherDataIdValue,
|
||||||
|
fundingAgencies: fundingAgencies,
|
||||||
|
acknowledgment: acknowledgment,
|
||||||
|
noteForChange: noteForChange,
|
||||||
|
contributor: contributor,
|
||||||
|
contributor_id: contributor_id,
|
||||||
|
}
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error {
|
||||||
|
exists, err := s.AssetExists(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.GetStub().DelState(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Data, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
if assetJSON == nil {
|
||||||
|
return nil, fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
var data Data
|
||||||
|
err = json.Unmarshal(assetJSON, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
||||||
|
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newContributor string, newContributorId string) (string, error) {
|
||||||
|
data, err := s.ReadAsset(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
data.contributor = newContributor
|
||||||
|
data.contributor_id = newContributorId
|
||||||
|
|
||||||
|
assetJSON, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.contributor, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
// ReadAsset returns the asset stored in the world state with given id.
|
||||||
|
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Asset, error) {
|
||||||
|
assetJSON, err := ctx.GetStub().GetState(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read from world state: %v", err)
|
||||||
|
}
|
||||||
|
if assetJSON == nil {
|
||||||
|
return nil, fmt.Errorf("the asset %s does not exist", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
var asset Asset
|
||||||
|
err = json.Unmarshal(assetJSON, &asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &asset, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TransferAsset updates the owner field of asset with given id in world state, and returns the old owner.
|
||||||
|
func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newOwner string) (string, error) {
|
||||||
|
asset, err := s.ReadAsset(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
oldOwner := asset.Owner
|
||||||
|
asset.Owner = newOwner
|
||||||
|
|
||||||
|
assetJSON, err := json.Marshal(asset)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ctx.GetStub().PutState(id, assetJSON)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return oldOwner, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllAssets returns all assets found in world state
|
||||||
|
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Asset, error) {
|
||||||
|
// range query with empty string for startKey and endKey does an
|
||||||
|
// open-ended query of all assets in the chaincode namespace.
|
||||||
|
resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resultsIterator.Close()
|
||||||
|
|
||||||
|
var assets []*Asset
|
||||||
|
for resultsIterator.HasNext() {
|
||||||
|
queryResponse, err := resultsIterator.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var asset Asset
|
||||||
|
err = json.Unmarshal(queryResponse.Value, &asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
assets = append(assets, &asset)
|
||||||
|
}
|
||||||
|
|
||||||
|
return assets, nil
|
||||||
|
}
|
||||||
|
*/
|
||||||
1
test-network/JsonSchemaValidationTests/testFile.json
Executable file
1
test-network/JsonSchemaValidationTests/testFile.json
Executable file
|
|
@ -0,0 +1 @@
|
||||||
|
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Carrera" }
|
||||||
|
|
@ -11,6 +11,7 @@ cd $HOME/OSC-IS/fabric-samples/asset-transfer-basic/chaincode-go
|
||||||
GO111MODULE=on go mod vendor
|
GO111MODULE=on go mod vendor
|
||||||
cd ../../test-network
|
cd ../../test-network
|
||||||
export PATH=${PWD}/../bin:$PATH
|
export PATH=${PWD}/../bin:$PATH
|
||||||
|
export PATH=$PATH:/usr/local/go/bin
|
||||||
export FABRIC_CFG_PATH=$PWD/../config/
|
export FABRIC_CFG_PATH=$PWD/../config/
|
||||||
peer version
|
peer version
|
||||||
|
|
||||||
|
|
@ -40,7 +41,7 @@ echo "========= chaincode queryinstalled ==========="
|
||||||
|
|
||||||
peer lifecycle chaincode queryinstalled
|
peer lifecycle chaincode queryinstalled
|
||||||
var=$(peer lifecycle chaincode queryinstalled)
|
var=$(peer lifecycle chaincode queryinstalled)
|
||||||
var2=$(echo $var | tail -n 1 | cut -f 3 -d ' ')
|
var2=$(echo $var | tail -n 1 | cut -f 7 -d ' ')
|
||||||
export CC_PACKAGE_ID=$(echo $var2 | sed 's/.$//')
|
export CC_PACKAGE_ID=$(echo $var2 | sed 's/.$//')
|
||||||
echo $CC_PACKAGE_ID
|
echo $CC_PACKAGE_ID
|
||||||
|
|
||||||
|
|
@ -82,7 +83,18 @@ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.exa
|
||||||
|
|
||||||
echo "========= Check creation of a new sample wit id = '00001' ==========="
|
echo "========= Check creation of a new sample wit id = '00001' ==========="
|
||||||
|
|
||||||
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"CreateDataSample","Args":["docTypeTest2","00001","TestTitle2","Desc2","Neuroscience","TestDOI","www.ncis.edu","TestManifest","TestFootPrint", "Neuroscience, brain", "None", "None", "None","None","None","None","None", "None"]}'
|
# peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"CreateDataSample","Args":["docTypeTest2","00001","TestTitle2","Desc2","Neuroscience","TestDOI","www.ncis.edu","TestManifest","TestFootPrint", "Neuroscience, brain", "None", "None", "None","None","None","None","None", "None"]}'
|
||||||
|
|
||||||
|
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"CreateDataSample","Args":["UCSD-SDSC", "Contributor123", "PhonyHash!@#$$%#@", "00001", ["DOE"] ["SOE"] ["SAE"]]}'
|
||||||
|
|
||||||
|
#peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile \
|
||||||
|
#"${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
|
||||||
|
# -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles \
|
||||||
|
# "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 \
|
||||||
|
# --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \
|
||||||
|
# -c '{"function":"CreateDataSample","Args":["UCSD-SDSC", "PhonyHash!@#$$%#@", "00001", DOE SOE SAE]}'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo "========= The code below will upgrade an existing ChainCode ==========="
|
echo "========= The code below will upgrade an existing ChainCode ==========="
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue