Smart Contract erstellen und bereitstellen
Für die Erstellung des Smart Contracts müssen wir die Entitäten definieren, die in Blockchain gespeichert und verwaltet werden sollen, wie im Entitätsmodell des folgenden Bildes dargestellt.
Beschreibung der Abbildung oracle-blockchain-cms-entity.png
Alle diese Entitys und ihre Beziehungen, die gesamte Logik, die zum Verwalten und Interagieren mit den Entitys sowie zum Persistieren im Blockchain-Ledger erforderlich ist, ist im Smart Contract definiert.
Der Ordner wird als NFT-Token dargestellt und wird daher als NFT entwickelt und initialisiert. Die anderen abhängigen Entitys (Dokumente und Eigenschaften) sind Standardentitys und untergeordnete Entitys des Ordners. Daher werden sie als Standardentitys ohne Initialisierung entwickelt.
Sobald der Smart-Vertrag erstellt ist, werden wir ihn in dem von uns erstellten Blockchain-Netzwerk installieren und bereitstellen.
Smart Contract erstellen
Nachdem Sie Oracle Blockchain App Builder konfiguriert haben, können Sie die Spezifikationsdatei erstellen. Die Spezifikationsdatei kann als einfache YAML-Datei erstellt werden, die im folgenden Code dargestellt wird.
Hinweis:
Sie können diese Datei auch von GitHub herunterladen: YAML-Datei herunterladen.#
# Token asset to manage the complete lifecycle of a non-fungible token representing a folder to hold docuements.
# This specification file will generate an Smartcontract project with a non-fungible token for the folders to be maintained by the users.
#
assets:
- name: folderNFT
type: token
symbol: eDocs
standard: erc721+
anatomy:
type: nonfungible
unit: whole
behavior:
- indivisible
- singleton
- mintable:
- transferable
- burnable
- roles:
minter_role_name: minter
properties:
- name: folderHASH
type: string
- name: documents
type: document[]
metadata:
- name: folderID
type: string
mandatory: true
id: true
- name: folderType
type: string
mandatory: true
methods:
crud: [create, getById, update, delete]
others: [getHistoryById, getByRange]
- name: document
properties:
- name: docName
type: string
mandatory: true
id: true
- name: docURL
type: string
mandatory: true
- name: docHASH
type: string
mandatory: true
- name: docType
type: string
mandatory: true
- name: docProperties
type: docProperty[]
methods:
crud: [create, getById, update, delete]
others: [getHistoryById, getByRange]
- name: docProperty
type: embedded
properties:
- name: propName
type: string
mandatory: true
- name: propValue
type: string
mandatory: true
methods:
crud: [create, getById, update, delete]
others: [getHistoryById, getByRange]
customMethods:
- executeQuery
- "attachDocument(tokenId: string, docName: string, docURL: string, docHASH: string, docType: string, docProps: string[], docVals: string[])" # Attach a document to an existing folder.
- "retrieveDocuments(tokenId: string)" # Retrieve Documents of an folder.
- "transferFolder(tokenId: string, fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string)" # Transfer the folder among participants.
- "updateFolderHASH(tokenId: string, newHash: string)" # Update HASH folder
- "getFolderHASH(tokenId: string)" # Check HASH folder
In dieser Spezifikationsdatei werden in der ersten definierten Entity (folderNFT) alle Abschnitte und Attribute für die Darstellung eines NFT-Tokens angezeigt. Übersicht über die in der Datei definierten Abschnitte:
- Vermögensgegenstände: Ort, an dem die verschiedenen Vermögensgegenstände (Standardentitäten, Finanztransaktionen, NFTs) definiert sind. Innerhalb jedes der Assets können wir verschiedene Abschnitte unterscheiden, die je nach Art des dargestellten Assets variieren können. Für NFTs und FTs sind dies die verschiedenen Unterabschnitte:
- Typ/Symbol/Standard: Geben Sie an, dass dieses Token auf dem ERC-721-Standard basiert, und geben Sie ihm einen eindeutigen Symbolbezeichner.
- Anatomie: Geben Sie an, ob es sich um eine NFT handelt und ob sie in kleinere Brüche unterteilt ist (heute ist "ganz" die einzige Option für NFT-Token).
- Verhalten: Definiert, ob das Token geprägt werden kann, und in diesem Fall, wie viele Münztoken maximal zulässig sind. Hier müssen Sie auch angeben, dass es sich um ein unteilbares Token handelt, wenn es Singleton für jede Klasse ist, übertragbar und brennbar, das seiner Löschung ähnlich ist (aber nicht verschwindet, also ist es immer noch da, aber überhaupt nicht verwendbar). Außerdem können Sie in diesem Abschnitt das Tokenverhalten auf bestimmte Rollen beschränken.
- Metadaten: Definiert eine Art von Eigenschaften, die bei der Tokenerstellung festgelegt werden müssen und in Zukunft nicht mehr geändert werden können. So wird sein Wert für das ganze Leben des Tokens unveränderlich bleiben.
- Eigenschaften: Definiert Standardattribute des Tokens, die während der Lebensdauer des Tokens variieren können, wie das Array der Dokumente, aus denen der Ordner besteht.
- customMethods: Speicherort, an dem die Liste der benutzerdefinierten Methoden definiert werden muss. Bei diesen Methoden generiert Oracle Blockchain App Builder nur die Signatur der Methode, ohne dass sie implementiert wird. Die Implementierung dieser Methoden ist der einzige Code, der vom Entwickler implementiert werden kann.
Die folgenden Links beschreiben, wie Sie jede Art von Entity (NFT-, FT- oder Standard-Entitys) basierend auf Ihren Geschäftsanforderungen konfigurieren:
- Standardentität, siehe So erstellen Sie eine Eingabespezifikationsdatei.
- Entity, die als NFT dargestellt wird, siehe Eingabespezifikationsdatei für nicht fungierbare Token.
- Entity, die als Finanztransaktion dargestellt wird, siehe Eingabespezifikationsdatei für fungierbare Token.
Nachdem die Spezifikationsdatei erstellt wurde, können wir Oracle Blockchain App Builder auffordern, das Gerüst des Projekts zu erstellen, indem wir die folgenden nächsten Schritte ausführen.
oracle-blockchain-nft-token-oracle.zip
Jetzt kann der Chaincode verwendet werden. Daher können wir den Chaincode lokal bereitstellen und testen, indem wir die Anweisungen unter Test Your Chaincode on a Local Hyperledger Fabric Network befolgen.
Smart Contract bereitstellen
Nachdem wir den Chaincode lokal getestet haben, stellen Sie ihn in dem realen Netzwerk bereit, das zuvor mit der Oracle Blockchain Service Console erstellt wurde. Gehen Sie dazu wie folgt vor:
- Verpackung des Chaincode-Projekts.
- Chaincode-Package in der Einzelinstanz (Gründer) installieren und bereitstellen
- Erstellen Sie das bereitstellbare Package aus dem Chaincode-Projekt. Klicken Sie in Visual Studio auf die rechte Schaltfläche über dem Chaincode-Projektnamen, wählen Sie im Popup-Menü die Option Package aus, und wählen Sie das Verzeichnis aus, in dem die Chaincode-Packagedatei gespeichert werden soll.
- Rufen Sie die Oracle Blockchain Service Console auf, um das Chaincode-Package in der Gründerinstanz zu installieren und bereitzustellen.
- Navigieren Sie zur Registerkarte Chaincode, und klicken Sie auf Neuen Chaincode bereitstellen.
- Wählen Sie die Option Erweitertes Deployment aus.
- Legen Sie alle Werte fest, um das Chaincode-Package in der Gründerinstanz zu installieren, und klicken Sie auf Weiter.
- Packagelabel: Geben Sie einen Namen an, mit dem Sie ermitteln können, welches Package in den verschiedenen vorhandenen Kanälen installiert ist. Da mehrere Versionen desselben Smart Contracts in verschiedenen Kanälen bereitgestellt werden können, empfiehlt es sich, einen Paketlabelnamen festzulegen, wie:
<smartContractName>_<channel>_<version>
- Chaincode-Sprache: Wählen Sie eine der verschiedenen Sprachen aus, je nachdem, in welcher Sprache Sie den Chaincode entwickelt haben.
- Ziel-Peers: Wählen Sie die Peers aus, in denen Sie das Chaincode-Package installieren möchten.
- Is Packaged Chaincode: Lassen Sie dieses Kontrollkästchen deaktiviert, wenn Sie eine ZIP-Datei hochladen. Aktivieren Sie das Kontrollkästchen für
tar.gz
-Dateien. - Chaincodequelle: Klicken Sie auf Chaincode-Datei hochladen, und wählen Sie die Chaincode-ZIP-Datei aus.
- Packagelabel: Geben Sie einen Namen an, mit dem Sie ermitteln können, welches Package in den verschiedenen vorhandenen Kanälen installiert ist. Da mehrere Versionen desselben Smart Contracts in verschiedenen Kanälen bereitgestellt werden können, empfiehlt es sich, einen Paketlabelnamen festzulegen, wie:
- Wenn die Installation erfolgreich verläuft, wird die Erfolgsmeldung angezeigt. Der nächste Schritt ist das Deployment des Chaincodes im ausgewählten Kanal. Sie müssen also alle Werte für die Deployment-Phase festlegen und auf Weiter klicken.
- Kanal: Wählen Sie den Kanal aus, in dem Sie den Smart Contract bereitstellen möchten.
- Chaincode-Name: Legen Sie den Namen fest, mit dem der Smart Contract im Kanal bereitgestellt wird.
- Version: Weisen Sie diesem Deployment eine Nummer zu, die an dem zuvor installierten Package ausgerichtet ist. Auf diese Weise können Sie Pakete korrelieren, die mit Chaincodes installiert sind, die in verschiedenen Kanälen bereitgestellt werden.
- Erforderlich: Aktivieren Sie dieses Kontrollkästchen, wenn die Methode
init
des Chaincodes aufgerufen werden muss, bevor Benutzertransaktionen zugelassen werden können. - Bestätigungs-Policy: Geben Sie während des Deployments Bestätigungs-Policys an. In diesem Lösungs-Playbook-Beispiel verwenden wir keine Bestätigungsrichtlinien.
- Private Datenerfassung: Legen Sie bei Bedarf private Datenerfassung fest. In diesem Lösungsbeispiel werden wir die private Datenerfassung nicht einstellen.
Smart Contract initialisieren
Wenn Sie sich mit FTs und NFT-Token befassen, müssen Sie eine Reihe administrativer Aktionen ausführen, bevor Sie Ihre Geschäftsmethoden ausführen können. Mit Oracle Blockchain können alle administrativen Aufgaben als einfache REST-Aufrufe ausgeführt werden. Dadurch wird der Aufwand für die Initialisierung des Smart Contracts erheblich reduziert.
Hinweis:
Bevor Sie einen der folgenden Schritte ausführen, müssen Sie die enrollmentIDs in den REST-Proxys für die Benutzer erstellen, denen Zugriff auf die Smart Contract-Methoden erteilt wurde. Die Registrierung ist eine Zuordnung zwischen dem Benutzernamen, der die REST-API aufruft, und den Accounts, die intern von der Blockchain verwaltet werden, denen Token zugewiesen werden, wie im Thema Anmeldungen in den REST-Proxyknoten erstellen beschrieben.Verwenden Sie die folgende Postman-Sammlung, um den Smart Contract einfach zu initialisieren: Postman-Sammlung herunterladen
Im Ordner AdminSteps dieser Postman-Collection müssen drei Anforderungsaufrufe für die Smart Contract-Initialisierung ausgeführt werden.
Die Postman-Sammlung kann verwendet werden, aber es gibt eine Reihe von Variablen, die an Ihre eigene Umgebung angepasst werden müssen (Passwörter, URLs usw.). Diese Variablen werden in der Registerkarte Variablen der Postman-Collection festgelegt. Die folgende Tabelle zeigt alle Variablen, die wir definiert haben und an Ihre Umgebung angepasst werden müssen.
Variablenname | Variabler Wert |
---|---|
bc_founder_provider_url | https://org1-w.... |
bc_timeout | 60.000 |
bc_nft_founder_userid1 | cmsleg001 |
bc_nft_founder_userid1_pwd | Kennwort |
bc_nft_founder_userid2 | cmsfin001 |
bc_nft_founder_userid2_pwd | Kennwort |
bc_nft_founder_userid3 | cmsrsk001 |
bc_nft_founder_userid4_pwd | Kennwort |
bc_channel_name | Wedocms |
bc_chaincode_name | WEDOCMS |
Suchen Sie den Endpunkt, in dem die REST-API über die Blockchain Service-Konsole zugänglich ist.
- Intelligente Vertragsinitialisierung (Admin-Benutzerkonten starten).
- Erstellung von Wallets für Benutzer, die Eigentümer der NFT-Token sein können.
- Untergeordnete Rolle für Benutzer zuweisen, die über diese Berechtigung verfügen sollten.
AdminSteps
aus der angegebenen Postman-Collection.
- Initialisieren Sie den Chaincode (Step-0: Admin-Benutzerkonto initialisieren), der angibt, welche Benutzerkonten zur Ausführung administrativer Aufgaben berechtigt sind. Es ist wichtig, die Argumente der Methode
init
korrekt festzulegen:args: Scaped array of user_ids with their org_ids
.{ "chaincode": "{{bc_nft_chaincode_name}}", "args": [ "init", "[{\"orgId\":\"org1\",\"userId\":\"cmsleg001\"},{\"orgId\":\"org1\",\"userId\":\"cmsfin001\"},{\"orgId\":\"org1\",\"userId\":\"cmsrsk001\"}]" ], "timeout": {{bc_timeout}}, "isInit": true, "sync": true }
- Erstellen Sie Benutzeraccounts für alle Benutzer, die Verwahrer der NFT-Assets für die physischen Assets sein können. Sie können dazu die Postman-Anforderung Step-1: Create account ausführen. Für die Einzelheiten unseres Anwendungsfalls gibt es nur drei Benutzer, die sich auf dieselbe einzelne Organisation beziehen, die zum Netzwerk gehört. Dieser Aufruf muss so oft ausgeführt werden wie Benutzer, für die wir ein Konto erstellen möchten. In unserem Fall dreimal mit jeweils folgenden Parametern:
"createAccount", "org1", "cmsleg001", "nonfungible"
"createAccount", "org1", "cmsfin001", "nonfungible"
"createAccount", "org1", "cmsrsk001", "nonfungible"
{ "chaincode": "{{bc_nft_chaincode_name}}", //Smartcontract name "args": [ "createAccount", "org1","cmsleg001","nonfungible" //Method, OrgID, UserID, fungible for FT / nonfungible for NFT ], "timeout": 60000, "sync": true }
- Legen Sie fest, welcher Benutzer Token mint darf. In diesem Fall bedeutet Token mint, einen neuen Ordner für eine neue Gruppe von Dokumenten zu erstellen. Sie können also entscheiden, welcher der drei vorhandenen Benutzer (cmsleg001, cmsfin001 oder cmsrsk001) diese Aktionen ausführen kann, und für diese Benutzer die Anforderung Schritt-2: AddRole aus der Postman-Collection ausführen.
{ "chaincode": "{{bc_nft_chaincode_name}}", //Smartcontract name "args": [ "addRole", //Method name "minter","org1","cmsleg001" //Role, OrgId, UserID ], "timeout": 60000, "sync": true }