Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπέρα, επειδη ειμαι νεος στη go εχω μια απορια, 
 

// InitLedger adds a base set of cars to the ledger
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
    cars := []Car{
        Car{Make: "Toyota", Model: "Prius", Colour: "blue", Owner: "Tomoko"},
        Car{Make: "Ford", Model: "Mustang", Colour: "red", Owner: "Brad"},
        Car{Make: "Hyundai", Model: "Tucson", Colour: "green", Owner: "Jin Soo"},
        Car{Make: "Volkswagen", Model: "Passat", Colour: "yellow", Owner: "Max"},
        Car{Make: "Tesla", Model: "S", Colour: "black", Owner: "Adriana"},
        Car{Make: "Peugeot", Model: "205", Colour: "purple", Owner: "Michel"},
        Car{Make: "Chery", Model: "S22L", Colour: "white", Owner: "Aarav"},
        Car{Make: "Fiat", Model: "Punto", Colour: "violet", Owner: "Pari"},
        Car{Make: "Tata", Model: "Nano", Colour: "indigo", Owner: "Valeria"},
        Car{Make: "Holden", Model: "Barina", Colour: "brown", Owner: "Shotaro"},
    }

    for i, car := range cars {
        carAsBytes, _ := json.Marshal(car)
        err := ctx.GetStub().PutState("CAR"+strconv.Itoa(i), carAsBytes)

        if err != nil {
            return fmt.Errorf("Failed to put to world state. %s", err.Error())
        }
    }

    return nil
}


εχω αυτο το κομματι κωδικα, και παιρναει οπως φαινεται κατω τα στοιχεια με state CAR0, CAR1 κτλ, 
αν θελω να τα περασω ομως με βαση πχ τον κατασκευστη, πως το κανω; δηλαδη να το περναει ως Toyota, Ford κτλ, χωρις 0,1,κτλ

 

το struck για το car ειναι το εξης 
type Car struct {
    Make   string `json:"make"`
    Model  string `json:"model"`
    Colour string `json:"colour"`
    Owner  string `json:"owner"`
}

Κάθε προταση ευπρόσδεκτη. 

 

0*Vgo4W8v-PIjuo-7e

εδω δηλαδη στο id να εχω toyota κτλ, και ας το γραφει και στο make, δε με πειραζει

ευχαριστώ εκ των προτέρων

Δημοσ. (επεξεργασμένο)

Φαντάζομαι αντί για 

        err := ctx.GetStub().PutState("CAR"+strconv.Itoa(i), carAsBytes)

θα μπορούσες να βάλεις 

        err := ctx.GetStub().PutState(car.Make, carAsBytes)

Αλλά προφανώς για id, θα πρεπει να βαλεις κατι unique, ειτε guid ειτε Itoa. Το Car0, car1 ειναι επισης κακο id. Γιατι δεν βαζεις απλα αυξανομενο αριθμο το id? 

Επεξ/σία από Papakaliati
  • Thanks 1
Δημοσ. (επεξεργασμένο)

Η PutState() παιρνει σαν πρωτο ορισμα το key και σαν δευτερο τα δεδομενα ως bytes. Αρα ο κωδικας σου θα πρεπει να γινει:

for _, car := range cars {
	carAsBytes, err := json.Marshal(car)
	if err != nil {
		return err	
	}

	if err = ctx.GetStub().PutState(car.Make, carAsBytes); err != nil {
		return fmt.Errorf("failed to put to world state: %w", err)
	}
}

Ωστοσο δεν ειναι σωστη πρακτικη αφου το car.Make δεν ειναι μοναδικο σε καθε entry, οπως πρεπει για ενα key/id

 

Τι προσπαθεις να φτιαξεις με το hyperledger fabric, μηπως υπαρχει καποια αλλη λυση να σου προτεινουμε

Επεξ/σία από Caiden
  • Thanks 1
Δημοσ.

αρχικα να ευχαριστήσω και τους δύο σας.
 

ο κωδικας που παρεθεσα δεν ειναι ο δικος μου, αλλα πράγματι ειναι ο κωδικας απο το fabric στον οποιο στηριζω τον κωδικα μου. Σε μενα δε με πειραζει το Make, καθως το αντιστοιχο πεδίο που θα περασω ειναι μοναδικο. 

ειχα δοκιμασει το να επιλεξω ετσι το πεδιο αλλα δε μου το περναγε, ξαναδοκιμασα ομως τωρα και φαινεται σωστο. οποτε σας ευχαριστώ για αυτο. Το μονο διαφορετικο που εκανα τωρα ηταν το _ στο for, που δε το ειχα σκεφτει, οποτε ισως να επαιξε αυτο ρολο γιατι δε μου περναγε το compile με τιποτα πριν. 

Αν εχετε ορεξη για τετοιες μικρες χαζομαριτσες θα επιστρεψω σιγουρα την επομενη φορα που θα κολλησω  :) 

Δημοσ.
21 ώρες πριν, Rumpelstiltskin είπε

αρχικα να ευχαριστήσω και τους δύο σας.
 

ο κωδικας που παρεθεσα δεν ειναι ο δικος μου, αλλα πράγματι ειναι ο κωδικας απο το fabric στον οποιο στηριζω τον κωδικα μου. Σε μενα δε με πειραζει το Make, καθως το αντιστοιχο πεδίο που θα περασω ειναι μοναδικο. 

ειχα δοκιμασει το να επιλεξω ετσι το πεδιο αλλα δε μου το περναγε, ξαναδοκιμασα ομως τωρα και φαινεται σωστο. οποτε σας ευχαριστώ για αυτο. Το μονο διαφορετικο που εκανα τωρα ηταν το _ στο for, που δε το ειχα σκεφτει, οποτε ισως να επαιξε αυτο ρολο γιατι δε μου περναγε το compile με τιποτα πριν. 

Αν εχετε ορεξη για τετοιες μικρες χαζομαριτσες θα επιστρεψω σιγουρα την επομενη φορα που θα κολλησω  :) 

σκέφτομαι να αρχίσω να ασχολούμαι με go, έχεις να προτείνεις κανενα καλό tutorial να ξεκινήσω? δε θέλω μόνο τα βασικά αλλά να φτάνει σε ενα καλό επίπεδο

 

Δημοσ.

κοιταξε, επειδη εχω εμπειρια σε αλλες γλωσσες, εγω δεν εκανα κανενα tutorial, και δεν ειχα και χρονο να ασχοληθω. Συνεπώς, δυστυχώς, δε μπορώ να σου προτείνω κάτι γιατι εγω δε διαβασα τίποτα. 
 
 

Δημοσ. (επεξεργασμένο)

αλλη μια ερωτηση, επειδη κολλησα παλι, εχω δυο  Struct, εστω το Car που εχω πανω και ενα αλλο που εχει ως πεδιο και τυπου Car
του στυλ 

type Car1 struct {
    Make1   string `json:"make"`
    Model1  string `json:"model"`

    Test  Car `json:"test"`
}

 

και εχω ενα function που θελω να περναω τις τιμες σε αυτο το struct,
οποτε το θεμα μου ειναι πως περναω το τελευταιο ορισμα, 

θα κανω 
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --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":"ΟνομαΣυναρτησης","Args":["Πρωτη Παραμετρος","Δευτερη Παραμετρος", Εδώ πως το περναω ]}'

στο ledger τα εχω αποθηκεύσει με ενα μοναδικο αριθμό όπως λεγαμε τη προηγούμενη φορά.


 

package main

import (
	"encoding/json"
	"fmt"
	"strconv"

	"github.com/hyperledger/fabric-contract-api-go/contractapi"
)

// SmartContract provides functions for managing a car
type SmartContract struct {
	contractapi.Contract
}

// Car describes basic details of what makes up a car
type Car struct {
	Make   string `json:"make"`
	Model  string `json:"model"`
	Colour string `json:"colour"`
	Owner  string `json:"owner"`
}

// QueryResult structure used for handling result of query
type QueryResult struct {
	Key    string `json:"Key"`
	Record *Car
}

// InitLedger adds a base set of cars to the ledger
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
	cars := []Car{
		Car{Make: "Toyota", Model: "Prius", Colour: "blue", Owner: "Tomoko"},
		Car{Make: "Ford", Model: "Mustang", Colour: "red", Owner: "Brad"},
		Car{Make: "Hyundai", Model: "Tucson", Colour: "green", Owner: "Jin Soo"},
		Car{Make: "Volkswagen", Model: "Passat", Colour: "yellow", Owner: "Max"},
		Car{Make: "Tesla", Model: "S", Colour: "black", Owner: "Adriana"},
		Car{Make: "Peugeot", Model: "205", Colour: "purple", Owner: "Michel"},
		Car{Make: "Chery", Model: "S22L", Colour: "white", Owner: "Aarav"},
		Car{Make: "Fiat", Model: "Punto", Colour: "violet", Owner: "Pari"},
		Car{Make: "Tata", Model: "Nano", Colour: "indigo", Owner: "Valeria"},
		Car{Make: "Holden", Model: "Barina", Colour: "brown", Owner: "Shotaro"},
	}

	for i, car := range cars {
		carAsBytes, _ := json.Marshal(car)
		err := ctx.GetStub().PutState("CAR"+strconv.Itoa(i), carAsBytes)

		if err != nil {
			return fmt.Errorf("Failed to put to world state. %s", err.Error())
		}
	}

	return nil
}

// CreateCar adds a new car to the world state with given details
func (s *SmartContract) CreateCar(ctx contractapi.TransactionContextInterface, carNumber string, make string, model string, colour string, owner string) error {
	car := Car{
		Make:   make,
		Model:  model,
		Colour: colour,
		Owner:  owner,
	}

	carAsBytes, _ := json.Marshal(car)

	return ctx.GetStub().PutState(carNumber, carAsBytes)
}

// QueryCar returns the car stored in the world state with given id
func (s *SmartContract) QueryCar(ctx contractapi.TransactionContextInterface, carNumber string) (*Car, error) {
	carAsBytes, err := ctx.GetStub().GetState(carNumber)

	if err != nil {
		return nil, fmt.Errorf("Failed to read from world state. %s", err.Error())
	}

	if carAsBytes == nil {
		return nil, fmt.Errorf("%s does not exist", carNumber)
	}

	car := new(Car)
	_ = json.Unmarshal(carAsBytes, car)

	return car, nil
}

// QueryAllCars returns all cars found in world state
func (s *SmartContract) QueryAllCars(ctx contractapi.TransactionContextInterface) ([]QueryResult, error) {
	startKey := "CAR0"
	endKey := "CAR99"

	resultsIterator, err := ctx.GetStub().GetStateByRange(startKey, endKey)

	if err != nil {
		return nil, err
	}
	defer resultsIterator.Close()

	results := []QueryResult{}

	for resultsIterator.HasNext() {
		queryResponse, err := resultsIterator.Next()

		if err != nil {
			return nil, err
		}

		car := new(Car)
		_ = json.Unmarshal(queryResponse.Value, car)

		queryResult := QueryResult{Key: queryResponse.Key, Record: car}
		results = append(results, queryResult)
	}

	return results, nil
}

// ChangeCarOwner updates the owner field of car with given id in world state
func (s *SmartContract) ChangeCarOwner(ctx contractapi.TransactionContextInterface, carNumber string, newOwner string) error {
	car, err := s.QueryCar(ctx, carNumber)

	if err != nil {
		return err
	}

	car.Owner = newOwner

	carAsBytes, _ := json.Marshal(car)

	return ctx.GetStub().PutState(carNumber, carAsBytes)
}

func main() {

	chaincode, err := contractapi.NewChaincode(new(SmartContract))

	if err != nil {
		fmt.Printf("Error create fabcar chaincode: %s", err.Error())
		return
	}

	if err := chaincode.Start(); err != nil {
		fmt.Printf("Error starting fabcar chaincode: %s", err.Error())
	}
}

αυτος ειναι ο κωδικας του fabcar που προσπαθω να πειραξω

και κατω στο περιπου η συναρτηση που προσπαθω να φτιαξω

func (s *SmartContract) TestName(ctx contractapi.TransactionContextInterface, value1 string, value2 string, carofinterest Car ) error {

	car1 := Car1{
		Make: 	    		  value1,
		Name: 	   			  value2,
		Test:     carofinterest,
	}
	
	car1AsBytes, _ := json.Marshal(car1)
	return ctx.GetStub().PutState(pck, car1AsBytes)
}

 

Επεξ/σία από Rumpelstiltskin
Δημοσ.

επανέρχομαι με ερώτηση.
θέλω να δίνει ενα string ας πουμε το "1590231900" το οποίο αντιστοιχεί στο 05/23/2020 @ 11:05am (UTC)

οπότε θέλω μετα να παιρνω το time.Now(), και να βλέπω αν το time.Now() εχει ξεπεράσει το string που έχω δώσει.

 

package main

import (
	"fmt"
	"strconv"
	"time"
	
)

func main() {

timer := time.Now()
fmt.Printf("%v\n", timer)


i, err := strconv.ParseInt("1590231900", 10, 64)
    if err != nil {
        panic(err)
    }
 
tm := time.Unix(i, 0)
    fmt.Println(tm)

	
}

αυτό έχω γράψει μέχρι στιγμής και νομίζω πως τα μετατρέπω στο ίδιο μέγεθος, το θέμα ειναι πως κανω τη σύγκριση. στις αναζητησεις που έναν περισσότερο μπερδεύτηκα παρά βρηκα λύση

Δημοσ.

Σου λειπει απλα ο ελεγχος που μπορεις να κανεις χρησιμοποιωντας το time

 

time.Now().After(tm)

 

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...