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
AVATAR 15 listopad 2018, 15:39

1 odpowiedź

Najlepsza odpowiedź
  1. 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 { }

  2. 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

  3. 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

  1. 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 )

  1. new Date() jest kodem niedeterministycznym - jeśli masz nadzieję osiągnąć konsensus wielu partnerów/organizacji.

  2. 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.

1
Paul O'Mahony 16 listopad 2018, 13:55