1. Chcę wiedzieć, czy mogę dokonać zmian w parametrze określonym w relacji.
To co chcę zrobić to utworzyć funkcję z nazwą bookflight, a następnie dokonać zmian w liczbie miejsc, jeśli lot jest zarezerwowany. to są moje pliki cto
namespace org.acme.airline.aircraft
/** Aircraft is an ACME Asset*/
asset Aircraft identified by aircraftId {
o String aircraftId
o Ownership ownershipType default="LEASED"
// Number of seats per class
o Integer firstClassSeats range = [4,]
o Integer businessClassSeats range = [6, 20]
o Integer economyClassSeats range = [30, ]
o String nickName optional
}
enum Ownership {
o LEASED
o OWNED
}
A dla lotu kod to
namespace org.acme.airline.flight
import org.acme.airline.aircraft.Aircraft
asset Flight identified by flightId {
// Solution to the exercise - try out the Regular expression at http://regex101.com
// Share your optimized regular expression with others :)
o String flightId regex=/[A-Z][A-Z][0-9][0-9][0-9]-[0-9][0-9]-[0-3][0-9]-[0-9][0-9]/
o String flightNumber
o Route route
o String[] aliasFlightNumber optional
--> Aircraft aircraft optional
}
concept Route {
o String origin regex=/[A-Z][A-Z][A-Z]/
o String destination regex=/[A-Z][A-Z][A-Z]/
o DateTime schedule
}
// Logistics department of ACME creates the flights
transaction CreateFlight {
o String flightNumber
o String origin
o String destination
o DateTime schedule
}
event FlightCreated {
o String flightId
}
// Assigns an aircraft to the flight
// The logistics / validation on availability of aircraft
// Kept outside of the Blockchain
transaction AssignAircraft {
o String flightId
o String aircraftId
}
// Event indicating that aircraft was assigned
event AircraftAssigned {
o String flightId
o String aircraftId
}
Teraz, co chcę wprowadzić zmiany w relacji w locie, aby wprowadzić zmiany w tym, co mam zrobić. Zrobiłem dostęp do pliku javascript, aby wprowadzić w nim zmiany.
function booktickets(registry){
//array to recored the hold the instances of aircraft resourse
const bnDef = bnUtil.connection.getBusinessNetwork();
const factory = bnDef.getFactory();
let flightResource = factory.newResource(aircraftNamespace,aircraftType,'AE201-05-05-2020');
flightResource.setPropertyValue('flightNumber','AE101');
flightResource.route = factory.newConcept(aircraftNamespace,'Route');
flightResource.route.setPropertyValue('origin', 'DEL');
flightResource.route.setPropertyValue('destination' , 'APH');
flightResource.route.setPropertyValue('schedule' , new Date('2018-10-15T21:44Z'));
flightResource.aircraft = factory.newRelationship('org.acme.airline.aircraft', 'Aircraft', 'CRAFT01');
//.setPropertyValue()
flightResource.aircraft.setPropertyValue('ownershipType','LEASED');
flightResource.aircraft.setPropertyValue('firstClassSeats',10);
flightResource.aircraft.setPropertyValue('businessClassSeats',10);
flightResource.aircraft.setPropertyValue('economyClassSeats',100);
return registry.update(flightResource).then(()=>{
console.log('Successfully created the flight!!!');
bnUtil.disconnect();
}).catch((error)=>{
console.log(error);
bnUtil.disconnect();
});
}
1 odpowiedź
Twoje pytanie brzmi: czy możesz utworzyć relację z lotu (zasobu) do samolotu (zasobu) w funkcji transakcyjnej (działającej w środowisku wykonawczym kodu łańcucha) i czy możesz zaktualizować pola powiązanego statku powietrznego (w jego oddzielnym rejestrze) . Odpowiedź brzmi „tak”, możesz, dla obu. Nie dostarczasz modelu dla funkcji
bookflight
, więc możesz jedynie przyjąć założenia dotyczące jego definicji modelu. jako minimum (na podstawie Twojego kodu) będzie potrzebować:transaction bookflight { }
Przykład kodu tego, co próbujesz zrobić z relacjami - pokazano tutaj -> https://github.com/hyperledger/composer-sample-networks/blob/master/packages/perishable-network/lib/logic.js#L130
Ta sekcja:
const bnDef = bnUtil.connection.getBusinessNetwork();
const factory = bnDef.getFactory();
Jest kodem composer-client - i nie będzie działać wewnątrz funkcji transakcyjnej (czyli kodu wykonawczego, musisz usunąć kod klienta - poniższy przykład pokazuje 'jak' to zrobić.) Zamień linię 2 na :
const factory = getFactory();
Zobacz więcej o funkcjach transakcji, przykładach itp. na https://hyperledger.github.io/composer /latest/referencja/js_scripts
uwaga: możesz po prostu przypisać wartości takie jak:
flightResource.route.origin = 'DEL' ; // no need for.setPropertyValue('origin', 'DEL'); etc etc
Nie widzę Twojego kodu do aktualizacji rejestru samolotów (z flightResource.aircraft
FYI) – ale potrzebujesz tego, aby zaktualizować pola w tym powiązanym zasobie (obecnie aktualizujesz tylko rejestr lotów powyżej )
new Date()
jest kodem niedeterministycznym - jeśli masz nadzieję osiągnąć konsensus wielu partnerów/organizacji.Zauważysz link, który wysłałem wcześniej, pokazuje użycie
async/await
zamiast obietnic JS (.wtedy itd. itd.) - łatwiejszy do kodowania, łatwiejszy do odczytania. Twoje zdrowie.
Podobne pytania
Nowe pytania
hyperledger-fabric
Hyperledger Fabric to implementacja technologii blockchain. Użyj tego tagu, jeśli masz pytania dotyczące tego projektu.