Rumpelstiltskin Δημοσ. 14 Μαΐου 2020 Δημοσ. 14 Μαΐου 2020 καλησπέρα, επειδη ειμαι νεος στη 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"` } Κάθε προταση ευπρόσδεκτη. εδω δηλαδη στο id να εχω toyota κτλ, και ας το γραφει και στο make, δε με πειραζει ευχαριστώ εκ των προτέρων
Papakaliati Δημοσ. 14 Μαΐου 2020 Δημοσ. 14 Μαΐου 2020 (επεξεργασμένο) Φαντάζομαι αντί για err := ctx.GetStub().PutState("CAR"+strconv.Itoa(i), carAsBytes) θα μπορούσες να βάλεις err := ctx.GetStub().PutState(car.Make, carAsBytes) Αλλά προφανώς για id, θα πρεπει να βαλεις κατι unique, ειτε guid ειτε Itoa. Το Car0, car1 ειναι επισης κακο id. Γιατι δεν βαζεις απλα αυξανομενο αριθμο το id? Επεξ/σία 14 Μαΐου 2020 από Papakaliati 1
Caiden Δημοσ. 14 Μαΐου 2020 Δημοσ. 14 Μαΐου 2020 (επεξεργασμένο) Η 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, μηπως υπαρχει καποια αλλη λυση να σου προτεινουμε Επεξ/σία 14 Μαΐου 2020 από Caiden 1
Rumpelstiltskin Δημοσ. 14 Μαΐου 2020 Μέλος Δημοσ. 14 Μαΐου 2020 αρχικα να ευχαριστήσω και τους δύο σας. ο κωδικας που παρεθεσα δεν ειναι ο δικος μου, αλλα πράγματι ειναι ο κωδικας απο το fabric στον οποιο στηριζω τον κωδικα μου. Σε μενα δε με πειραζει το Make, καθως το αντιστοιχο πεδίο που θα περασω ειναι μοναδικο. ειχα δοκιμασει το να επιλεξω ετσι το πεδιο αλλα δε μου το περναγε, ξαναδοκιμασα ομως τωρα και φαινεται σωστο. οποτε σας ευχαριστώ για αυτο. Το μονο διαφορετικο που εκανα τωρα ηταν το _ στο for, που δε το ειχα σκεφτει, οποτε ισως να επαιξε αυτο ρολο γιατι δε μου περναγε το compile με τιποτα πριν. Αν εχετε ορεξη για τετοιες μικρες χαζομαριτσες θα επιστρεψω σιγουρα την επομενη φορα που θα κολλησω
velociraptoras Δημοσ. 15 Μαΐου 2020 Δημοσ. 15 Μαΐου 2020 21 ώρες πριν, Rumpelstiltskin είπε αρχικα να ευχαριστήσω και τους δύο σας. ο κωδικας που παρεθεσα δεν ειναι ο δικος μου, αλλα πράγματι ειναι ο κωδικας απο το fabric στον οποιο στηριζω τον κωδικα μου. Σε μενα δε με πειραζει το Make, καθως το αντιστοιχο πεδίο που θα περασω ειναι μοναδικο. ειχα δοκιμασει το να επιλεξω ετσι το πεδιο αλλα δε μου το περναγε, ξαναδοκιμασα ομως τωρα και φαινεται σωστο. οποτε σας ευχαριστώ για αυτο. Το μονο διαφορετικο που εκανα τωρα ηταν το _ στο for, που δε το ειχα σκεφτει, οποτε ισως να επαιξε αυτο ρολο γιατι δε μου περναγε το compile με τιποτα πριν. Αν εχετε ορεξη για τετοιες μικρες χαζομαριτσες θα επιστρεψω σιγουρα την επομενη φορα που θα κολλησω σκέφτομαι να αρχίσω να ασχολούμαι με go, έχεις να προτείνεις κανενα καλό tutorial να ξεκινήσω? δε θέλω μόνο τα βασικά αλλά να φτάνει σε ενα καλό επίπεδο
Rumpelstiltskin Δημοσ. 15 Μαΐου 2020 Μέλος Δημοσ. 15 Μαΐου 2020 κοιταξε, επειδη εχω εμπειρια σε αλλες γλωσσες, εγω δεν εκανα κανενα tutorial, και δεν ειχα και χρονο να ασχοληθω. Συνεπώς, δυστυχώς, δε μπορώ να σου προτείνω κάτι γιατι εγω δε διαβασα τίποτα.
Rumpelstiltskin Δημοσ. 17 Μαΐου 2020 Μέλος Δημοσ. 17 Μαΐου 2020 (επεξεργασμένο) αλλη μια ερωτηση, επειδη κολλησα παλι, εχω δυο 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) } Επεξ/σία 17 Μαΐου 2020 από Rumpelstiltskin
Rumpelstiltskin Δημοσ. 23 Μαΐου 2020 Μέλος Δημοσ. 23 Μαΐου 2020 επανέρχομαι με ερώτηση. θέλω να δίνει ενα 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) } αυτό έχω γράψει μέχρι στιγμής και νομίζω πως τα μετατρέπω στο ίδιο μέγεθος, το θέμα ειναι πως κανω τη σύγκριση. στις αναζητησεις που έναν περισσότερο μπερδεύτηκα παρά βρηκα λύση
Caiden Δημοσ. 23 Μαΐου 2020 Δημοσ. 23 Μαΐου 2020 Σου λειπει απλα ο ελεγχος που μπορεις να κανεις χρησιμοποιωντας το time time.Now().After(tm) 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα