Blockchain: Hangi PoC'yi oluşturmalıyız?

Gözlerin korkuyor ve ellerin kaşınıyor!

Önceki yazılarımızda blockchainlerin üzerine kurulduğu teknolojileri ele almıştık (Blockchain'i ne inşa etmeliyiz?) ve onların yardımıyla uygulanabilecek durumlar (Neden bir vaka oluşturmalıyız?). Ellerinizle çalışma zamanı! Pilot uygulamaları ve PoC'yi (Kavram Kanıtı) uygulamak için bulutları kullanmayı tercih ediyorum çünkü... bunlara dünyanın her yerinden erişilebilir ve çoğu zaman ortamın sıkıcı kurulumuyla zaman kaybetmeye gerek yoktur, çünkü Önceden ayarlanmış konfigürasyonlar vardır. Öyleyse basit bir şey yapalım, örneğin katılımcılar arasında para transferi için bir ağ yapalım ve buna mütevazı bir şekilde Bitcoin diyelim. Bunun için IBM bulutunu ve evrensel blockchain Hyperledger Fabric'i kullanacağız. Öncelikle Hyperledger Fabric'in neden evrensel blockchain olarak adlandırıldığını anlayalım.

Blockchain: Hangi PoC'yi oluşturmalıyız?

Hyperledger Fabric - evrensel bir blockchain

Genel olarak konuşursak, evrensel bir bilgi sistemi:

  • İş mantığını gerçekleştiren bir dizi sunucu ve bir yazılım çekirdeği;
  • Sistemle etkileşim için arayüzler;
  • Cihazların/kişilerin kaydı, kimlik doğrulaması ve yetkilendirilmesine yönelik araçlar;
  • Operasyonel ve arşivsel verileri saklayan veritabanı:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Hyperledger Fabric'in resmi versiyonunu şuradan okuyabilirsiniz: web sitesiKısaca Hyperledger Fabric, özel blok zincirler oluşturmanıza ve JS ve Go programlama dillerinde yazılmış isteğe bağlı akıllı sözleşmeler yürütmenize olanak tanıyan açık kaynaklı bir platformdur. Hyperledger Fabric'in mimarisine ayrıntılı olarak bakalım ve bunun yalnızca veri depolama ve kaydetme özelliklerine sahip evrensel bir sistem olduğundan emin olalım. Spesifiklik, tüm blok zincirlerde olduğu gibi verilerin, yalnızca katılımcılar bir fikir birliğine vardığında ve kayıttan sonra verilerin sessizce düzeltilememesi veya silinememesi durumunda blok zincirine yerleştirilen bloklarda saklanmasıdır.

Hyperledger Yapı Mimarisi

Diyagram Hyperledger Fabric mimarisini göstermektedir:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Organizasyonlar — organizasyonlar emsalleri içerir, ör. Blockchain kuruluşların desteği sayesinde var oluyor. Farklı kuruluşlar aynı kanalın parçası olabilir.

Telegram Kanal — akranları gruplar halinde birleştiren mantıksal bir yapı; blok zinciri belirtilir. Hyperledger Fabric, farklı iş mantığına sahip birden fazla blok zincirini aynı anda işleyebilir.

Üyelik Hizmetleri Sağlayıcısı (MSP) kimlik vermek ve rol atamak için kullanılan bir CA'dır (Sertifika Yetkilisi). Bir düğüm oluşturmak için MSP ile etkileşime girmeniz gerekir.

Eş düğümler — işlemleri doğrulayın, blok zincirini saklayın, akıllı sözleşmeleri yürütün ve uygulamalarla etkileşim kurun. Akranların MSP tarafından verilen bir kimliği (dijital sertifika) vardır. Tüm düğümlerin eşit haklara sahip olduğu Bitcoin veya Etherium ağından farklı olarak Hyperledger Fabric'te düğümler farklı roller oynar:

  • Akran belki onaylayan akran (EP) ve akıllı sözleşmeleri yürütün.
  • Bağlılık akranı (CP) - verileri yalnızca blok zincirine kaydedin ve “Dünya durumunu” güncelleyin.
  • Çapa Eşi (AP) - birden fazla kuruluş blok zincirine katılıyorsa, aralarındaki iletişim için bağlantı eşleri kullanılır. Her organizasyonun bir veya daha fazla referans eşe sahip olması gerekir. AP'yi kullanarak bir kuruluştaki herhangi bir eş, diğer kuruluşlardaki tüm eşler hakkında bilgi alabilir. AP'ler arasında bilgi senkronizasyonu için kullanılır dedikodu protokolü.
  • Lider Arkadaş — bir kuruluşun birden fazla eşe sahip olması durumunda, yalnızca eşin lideri Sipariş hizmetinden bloklar alacak ve bunları diğer eşlere verecektir. Lider, kuruluştaki eşler tarafından statik olarak belirlenebileceği gibi dinamik olarak da seçilebilir. Dedikodu protokolü aynı zamanda liderler hakkındaki bilgileri senkronize etmek için de kullanılıyor.

Varlıklar — değeri olan ve blok zincirinde saklanan varlıklar. Daha spesifik olarak bu, JSON biçimindeki anahtar/değer verileridir. Blockchain'e kaydedilen bu verilerdir. Blockchain'de saklanan bir geçmişleri ve "Dünya durumu" veritabanında saklanan mevcut durumları vardır. Veri yapıları iş görevlerine bağlı olarak keyfi olarak doldurulur. Gerekli alanlar yoktur, tek öneri varlıkların bir sahibi olması ve değerli olmasıdır.

Defteri kebir — Varlıkların mevcut durumunu saklayan Blockchain ve Word durum veritabanından oluşur. Dünya durumu LevelDB veya CouchDB'yi kullanıyor.

Akıllı sözleşme — Akıllı sözleşmeler kullanılarak sistemin iş mantığı uygulanır. Hyperledger Fabric'te akıllı sözleşmelere zincir kodu adı verilmektedir. Chaincode kullanılarak varlıklar ve üzerlerindeki işlemler belirtilir. Teknik açıdan akıllı sözleşmeler, JS veya Go programlama dillerinde uygulanan yazılım modülleridir.

Onay politikası — her zincir kodu için, bir işlem için kaç onayın kimden beklenmesi gerektiğine ilişkin bir politika belirleyebilirsiniz. Politika ayarlanmazsa varsayılan şu şekildedir: "işlem, kanaldaki herhangi bir kuruluşun herhangi bir üyesi tarafından onaylanmalıdır." Politika örnekleri:

  • İşlemin kuruluşun herhangi bir yöneticisi tarafından onaylanması gerekir;
  • Kuruluşun herhangi bir üyesi veya müşterisi tarafından onaylanmalıdır;
  • Herhangi bir eş kuruluş tarafından onaylanmalıdır.

sipariş hizmeti — işlemleri bloklar halinde paketler ve bunları kanaldaki eşlere gönderir. Mesajların ağdaki tüm eşlere teslimini garanti eder. Endüstriyel sistemler için kullanılır Kafka mesaj komisyoncusu, geliştirme ve test için Solo.

Çağrı akışı

Blockchain: Hangi PoC'yi oluşturmalıyız?

  • Uygulama, Go, Node.js veya Java SDK'yı kullanarak Hyperledger Fabric ile iletişim kurar;
  • Müşteri bir tx işlemi oluşturur ve bunu onaylayan eşlere gönderir;
  • Eş, müşterinin imzasını doğrular, işlemi tamamlar ve ciro imzasını müşteriye geri gönderir. Chaincode yalnızca onaylayan eşte yürütülür ve yürütülmesinin sonucu tüm eşlere gönderilir. Bu çalışma algoritmasına PBFT (Practical Bizans Fault Tolerant) konsensüsü adı verilir. Şundan farklı: klasik BFT mesajın gönderildiği ve onayın tüm katılımcılardan değil, yalnızca belirli bir kesimden beklendiği;
  • Müşteri, onay politikasına karşılık gelen yanıt sayısını aldıktan sonra işlemi Sipariş hizmetine gönderir;
  • Sipariş hizmeti bir blok oluşturur ve bunu taahhüt eden tüm eşlere gönderir. Sipariş hizmeti, blokların sıralı olarak kaydedilmesini sağlar ve bu da defter çatalı olarak adlandırılan durumu ortadan kaldırır ("Çatallar" bölümüne bakın);
  • Eşler bir blok alır, onay politikasını tekrar kontrol eder, bloğu blok zincirine yazar ve "Dünya durumu" DB'sindeki durumu değiştirir.

Onlar. Bu, düğümler arasında rol paylaşımına neden olur. Bu, blockchain'in ölçeklenebilir ve güvenli olmasını sağlar:

  • Akıllı sözleşmeler (zincir kodu), eşleri onaylama işlemini gerçekleştirir. Bu akıllı sözleşmelerin gizliliğini sağlar çünkü tüm katılımcılar tarafından değil, yalnızca onaylayan akranlar tarafından depolanır.
  • Sipariş hızlı bir şekilde çalışmalıdır. Bu, Ordering'in yalnızca bir blok oluşturması ve onu sabit bir lider eşler grubuna göndermesiyle sağlanır.
  • Bağlı eşler yalnızca blok zincirini depolar; bunlardan çok sayıda olabilir ve çok fazla güç ve anında işlem gerektirmezler.

Hyperledger Fabric'in mimari çözümleri ve neden bu şekilde çalıştığı ve başka şekilde çalışmadığı hakkında daha fazla ayrıntıyı burada bulabilirsiniz: Mimarinin Kökenleri ya da burada: Hyperledger Fabric: İzin Verilen Blok Zincirleri için Dağıtılmış Bir İşletim Sistemi.

Yani Hyperledger Fabric, şunları yapabileceğiniz gerçek anlamda evrensel bir sistemdir:

  • Akıllı sözleşme mekanizmasını kullanarak keyfi iş mantığını uygulayın;
  • Blockchain veritabanındaki verileri JSON formatında kaydedin ve alın;
  • Sertifika Yetkilisini kullanarak API erişimi verin ve doğrulayın.

Artık Hyperledger Fabric'in özelliklerini biraz anladığımıza göre nihayet faydalı bir şeyler yapalım!

Blockchain'i dağıtma

Sorunun formüle edilmesi

Görev, Citcoin ağını aşağıdaki işlevlerle uygulamaktır: bir hesap oluşturun, bakiye alın, hesabınıza yükleme yapın, paraları bir hesaptan diğerine aktarın. Akıllı sözleşmede daha sonra uygulayacağımız bir nesne modeli çizelim. Yani isimlerle tanımlanan, bakiye içeren hesaplarımız ve hesap listemiz olacak. Hesaplar ve hesap listesi Hyperledger Fabric varlıkları açısındandır. Buna göre onların bir geçmişi ve güncel bir durumu var. Bunu açıkça çizmeye çalışacağım:

Blockchain: Hangi PoC'yi oluşturmalıyız?

En üstteki rakamlar “Dünya durumu” veritabanında saklanan mevcut durumdur. Altlarında ise blockchainde saklanan geçmişi gösteren rakamlar yer alıyor. Varlıkların mevcut durumu işlemlerle değiştirilir. Varlık yalnızca bir bütün olarak değişir, dolayısıyla işlem sonucunda yeni bir nesne oluşturulur ve varlığın mevcut değeri tarihe geçer.

IBM Bulutu

İçinde bir hesap oluşturuyoruz IBM bulutu. Blockchain platformunu kullanmak için Kullandıkça Öde'ye yükseltilmesi gerekiyor. Bu süreç hızlı olmayabilir, çünkü... IBM ek bilgi ister ve bunu manuel olarak doğrular. Olumlu bir not olarak, IBM'in, Hyperledger Fabric'i bulutlarında devreye almanıza olanak tanıyan iyi eğitim materyallerine sahip olduğunu söyleyebilirim. Aşağıdaki makale dizisini ve örnekleri beğendim:

Aşağıda IBM Blockchain platformunun ekran görüntüleri yer almaktadır. Bu, bir blockchain'in nasıl oluşturulacağına dair bir talimat değil, sadece görevin kapsamının bir gösterimidir. Dolayısıyla amaçlarımız doğrultusunda tek bir Organizasyon oluşturuyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

İçinde düğümler oluşturuyoruz: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Kullanıcılar yaratıyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Bir Kanal oluşturun ve buna citcoin adını verin:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Esasen Kanal bir blok zinciridir, dolayısıyla sıfır blokla (Genesis bloğu) başlar:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Akıllı Sözleşme Yazma

/*
 * Citcoin smart-contract v1.5 for Hyperledger Fabric
 * (c) Alexey Sushkov, 2019
 */
 
'use strict';
 
const { Contract } = require('fabric-contract-api');
const maxAccounts = 5;
 
class CitcoinEvents extends Contract {
 
    async instantiate(ctx) {
        console.info('instantiate');
        let emptyList = [];
        await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList)));
    }
    // Get all accounts
    async GetAccounts(ctx) {
        // Get account list:
        let accounts = '{}'
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            accounts = JSON.parse(accountsData.toString());
        } else {
            throw new Error('accounts not found');
        }
        return accountsData.toString()
    }
     // add a account object to the blockchain state identifited by their name
    async AddAccount(ctx, name, balance) {
        // this is account data:
        let account = {
            name: name,
            balance: Number(balance),       
            type: 'account',
        };
        // create account:
        await ctx.stub.putState(name, Buffer.from(JSON.stringify(account)));
 
        // Add account to list:
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            let accounts = JSON.parse(accountsData.toString());
            if (accounts.length < maxAccounts)
            {
                accounts.push(name);
                await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts)));
            } else {
                throw new Error('Max accounts number reached');
            }
        } else {
            throw new Error('accounts not found');
        }
        // return  object
        return JSON.stringify(account);
    }
    // Sends money from Account to Account
    async SendFrom(ctx, fromAccount, toAccount, value) {
        // get Account from
        let fromData = await ctx.stub.getState(fromAccount);
        let from;
        if (fromData) {
            from = JSON.parse(fromData.toString());
            if (from.type !== 'account') {
                throw new Error('wrong from type');
            }   
        } else {
            throw new Error('Accout from not found');
        }
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balances
        if ((from.balance - Number(value)) >= 0 ) {
            from.balance -= Number(value);
            to.balance += Number(value);
        } else {
            throw new Error('From Account: not enought balance');          
        }
 
        await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from)));
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "SendFrom",
            from: from.name,
            to: to.name,
            balanceFrom: from.balance,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
 
    // get the state from key
    async GetState(ctx, key) {
        let data = await ctx.stub.getState(key);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
    // GetBalance   
    async GetBalance(ctx, accountName) {
        let data = await ctx.stub.getState(accountName);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
     
    // Refill own balance
    async RefillBalance(ctx, toAccount, value) {
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balance
        to.balance += Number(value);
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "RefillBalance",
            to: to.name,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
}
module.exports = CitcoinEvents;

Sezgisel olarak burada her şey açık olmalıdır:

  • Demo programının Hyperledger Fabric API'sini kullanarak çağıracağı çeşitli işlevler (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) vardır.
  • SendFrom ve RefillBalance işlevleri, demo programının alacağı Olayları oluşturur.
  • Örnekleme işlevi, bir akıllı sözleşme başlatıldığında bir kez çağrılır. Aslında sadece bir kere değil, akıllı sözleşme versiyonu her değiştiğinde çağrılıyor. Bu nedenle, bir listeyi boş bir diziyle başlatmak kötü bir fikirdir çünkü Artık akıllı sözleşmenin versiyonunu değiştirdiğimizde mevcut listeyi kaybedeceğiz. Ama sorun değil, yeni öğreniyorum).
  • Hesaplar ve hesap listesi JSON veri yapılarıdır. JS veri işleme için kullanılır.
  • Bir varlığın mevcut değerini getState işlev çağrısını kullanarak alabilir ve putState'i kullanarak güncelleyebilirsiniz.
  • Hesap oluştururken, blockchaindeki maksimum hesap sayısı (maxAccounts = 5) için karşılaştırmanın yapıldığı AddAccount işlevi çağrılır. Ve burada hesap sayısında sonsuz bir artışa yol açan bir pervaz var (fark ettiniz mi?). Bu tür hatalardan kaçınılmalıdır)

Daha sonra akıllı sözleşmeyi Kanala yükleyip somutlaştırıyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Akıllı Sözleşme yükleme işlemine bakalım:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Kanalımızla ilgili ayrıntılara bakalım:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Sonuç olarak, IBM bulutundaki bir blockchain ağının aşağıdaki diyagramını elde ediyoruz. Diyagramda ayrıca Amazon bulutunda sanal bir sunucuda çalışan bir demo programı da gösterilmektedir (bununla ilgili daha fazla bilgi bir sonraki bölümde yer almaktadır):

Blockchain: Hangi PoC'yi oluşturmalıyız?

Hyperledger Fabric API çağrıları için GUI oluşturma

Hyperledger Fabric'in aşağıdaki amaçlarla kullanılabilecek bir API'si vardır:

  • Kanal oluşturun;
  • Eşler arası kanal bağlantıları;
  • Kanalda akıllı sözleşmelerin kurulumu ve başlatılması;
  • Arama işlemleri;
  • Blockchain hakkında bilgi isteyin.

Uygulama geliştirme

Demo programımızda API'yi yalnızca işlemleri çağırmak ve bilgi istemek için kullanacağız çünkü IBM blockchain platformunu kullanarak geri kalan adımları zaten tamamladık. Standart bir teknoloji yığını kullanarak bir GUI yazıyoruz: Express.js + Vue.js + Node.js. Modern web uygulamaları oluşturmaya nasıl başlayacağınıza dair ayrı bir makale yazabilirsiniz. Buraya en çok sevdiğim ders serisinin bağlantısını bırakacağım: Vue.js ve Express.js kullanan Tam Yığın Web Uygulaması. Sonuç, Google'ın Materyal Tasarımı tarzında tanıdık bir grafik arayüze sahip bir istemci-sunucu uygulamasıdır. İstemci ile sunucu arasındaki REST API birkaç çağrıdan oluşur:

  • HyperledgerDemo/v1/init - blok zincirini başlatın;
  • HyperledgerDemo/v1/accounts/list — tüm hesapların bir listesini alın;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — Bob hesabı oluşturun;
  • HyperledgerDemo/v1/info?account=Bob — Bob hesabı hakkında bilgi alın;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - Bob'dan Alice'e iki jeton aktarın;
  • HyperledgerDemo/v1/disconnect - blockchain bağlantısını kapatın.

API'nin, örneklerle birlikte açıklaması Postacı web sitesi - HTTP API'sini test etmek için iyi bilinen bir program.

Amazon bulutunda demo uygulaması

Uygulamayı Amazon'a yükledim çünkü... IBM hâlâ hesabımı yükseltemedi ve sanal sunucular oluşturmama izin vermedi. Etki alanına kiraz nasıl eklenir: www.citcoin.info. Sunucuyu bir süre açık tutacağım, sonra kapatacağım çünkü... kiralık sentler damlıyor ve citcoin coinleri henüz borsada listelenmiyor) İşin mantığı netleşsin diye yazıya demo ekran görüntülerini de ekliyorum. Demo uygulaması şunları yapabilir:

  • Blockchain'i başlatın;
  • Bir Hesap Oluşturun (ancak artık yeni bir Hesap oluşturamazsınız çünkü akıllı sözleşmede belirtilen maksimum hesap sayısına blockchain'de ulaşılmıştır);
  • Hesapların bir listesini alın;
  • Alice, Bob ve Alex arasında citcoin paralarını aktarın;
  • Olayları alın (ancak artık olayları göstermenin bir yolu yoktur, dolayısıyla basitlik açısından arayüz olayların desteklenmediğini söylüyor);
  • Eylemleri günlüğe kaydedin.

İlk önce blockchain'i başlatıyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Daha sonra hesabımızı oluşturuyoruz, bakiyeyle zaman kaybetmeyin:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Mevcut tüm hesapların bir listesini alıyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Göndereni ve alıcıyı seçip bakiyelerini alıyoruz. Gönderen ve alıcı aynıysa, hesabı yenilenecektir:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Günlükte işlemlerin yürütülmesini izliyoruz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Aslında demo programında hepsi bu. Aşağıda blockchaindeki işlemimizi görebilirsiniz:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Ve işlemlerin genel listesi:

Blockchain: Hangi PoC'yi oluşturmalıyız?

Bununla, Citcoin ağını oluşturmak için PoC uygulamasını başarıyla tamamladık. Citcoin'in tam teşekküllü bir para transferi ağı haline gelmesi için başka ne yapılması gerekiyor? Çok az:

  • Hesap oluşturma aşamasında, özel / genel anahtarın oluşturulmasını uygulayın. Özel anahtar hesap kullanıcısında saklanmalı, genel anahtar ise blok zincirinde saklanmalıdır.
  • Kullanıcıyı tanımlamak için isim yerine ortak anahtarın kullanıldığı bir para transferi yapın.
  • Kullanıcıdan sunucuya giden işlemleri özel anahtarıyla şifreleyin.

Sonuç

Citcoin ağını şu işlevlerle hayata geçirdik: hesap ekleme, bakiye alma, hesabınıza yükleme yapma, paraları bir hesaptan diğerine aktarma. Peki bir PoC oluşturmanın bize maliyeti nedir?

  • Genel olarak blockchain'i ve özel olarak Hyperledger Fabric'i incelemeniz gerekiyor;
  • IBM veya Amazon bulutlarını kullanmayı öğrenin;
  • JS programlama dilini ve bazı web çerçevelerini öğrenin;
  • Bazı verilerin blok zincirinde değil ayrı bir veritabanında saklanması gerekiyorsa, örneğin PostgreSQL ile entegrasyonu öğrenin;
  • Ve son fakat bir o kadar da önemli olarak, modern dünyada Linux bilgisi olmadan yaşayamazsınız!)

Elbette bu roket bilimi değil ama çok çalışmanız gerekecek!

GitHub'da Исходники

Kaynaklar açıklandı GitHub. Deponun kısa açıklaması:
Katalog "sunucu» — Node.js sunucusu
Katalog "müşteri» — Node.js istemcisi
Katalog "blockchain"(parametre değerleri ve anahtarlar elbette çalışmıyor ve sadece örnek olarak verilmiştir):

  • sözleşme — akıllı sözleşme kaynak kodu
  • cüzdan — Hyperledger Fabric API'yi kullanmak için kullanıcı anahtarları.
  • *.cds - akıllı sözleşmelerin derlenmiş sürümleri
  • *.json dosyaları - Hyperledger Fabric API'yi kullanmaya yönelik yapılandırma dosyası örnekleri

Bu sadece başlangıç!

Kaynak: habr.com

Yorum ekle