Nebulaslarda bir DApp necə qurulur (Hissə 2)

Ağıllı müqavilələrin yazılmasını asanlaşdırmaq üçün bir neçə kitabxana çap etdik. Bu o deməkdir ki, bu ağıllı müqavilələrdən hər hansı birini açıq şəkildə sıfırdan yaratmaq məcburiyyətində deyilsiniz, çünki sizin üçün ilk işi görmüşük.

"Nebulalarda DApp necə qurulacaq" ın ikinci hissəsində bu kitabxanalar, nə etdikləri və necə istifadə ediləcəyi barədə məlumat əldə edəcəyik.

Böyük nömrə

BigNumber modulu özbaşına dəqiqliklə ondalık və qeyri-ədədi hesab üçün JavaScript kitabxanası olan bignumber.js-dən istifadə edir. Müqavilə BigNumber-dan əməliyyat dəyərini və digər dəyər köçürmələrini işləmək üçün birbaşa istifadə edə bilər.

var dəyəri = yeni BigNumber (0); value.plus (1); ...

anbar

Yaddaş modulu dumanlıqlarda məlumat saxlamağa imkan verir. Daha doğrusu, bir ödəmə edildikdə vəziyyət dəyişkənlərinin Nebulas-da daimi saxlanmasına imkan verir, yəni. H. GAS, şərti bir əsas dəyər saxlama sisteminə bənzəyir. LocalContractStorage obyekti nömrələri, simləri və JavaScript obyektlərini simli formatda istifadə etməyə və qəbul etməyə imkan verən Nebulas quraşdırılmış saxlama obyektidir. Yalnız bu məlumatların saxlandığı müqavilə ona daxil ola və düzəldə bilər.

Əsaslar

LocalContractStorage üç əməliyyatı dəstəkləyir, i. H. Veriləri saxlamağınıza, oxumağınıza və silməyinizə imkan verən ayarlayın, alın və silin:

"ciddi istifadə edin";
var BankVaultContract = function () {// nothing};
BankVaultContract.prototype = {init: function () {// nothing}, set: function (name, value) {// name = "robin", value = 10000 LocalContractStorage.set ("name", name); // 'qoymaq' LocalContractStorage.put'u 'təyin etmək' üçün ekvivalent bir əməliyyatdır ("dəyər", dəyər); }, almaq: function () {var name = LocalContractStorage.get ("name"); console.log (ad); // 'robin' var value = LocalContractStorage.get ("dəyər") yazdırır; console.log (dəyər); // '10000' yazdırır}, del: function () {var result = LocalContractStorage.del ("name"); console.log (nəticə); // 'robin' yazdırır // 'sil', 'del' result = LocalContractStorage.delete ("dəyər") ilə bərabər bir əməliyyatdır; console.log (nəticə); // '10000' yazdırır // Məlumatları sildikdən sonra artıq oxumaq olmur}};
module.exports = BankVaultContract;

Qabaqcıl

Yuxarıda sadalanan əsas istifadələrə əlavə olaraq, LocalContractStorage ayrıca saxlama xüsusiyyətlərinin müəyyənləşdirilməsini və eşleme şəkillərinin obyektləşdirilməsini və serializasiya metodlarını da dəstəkləyir.

  • Saxlama xüsusiyyətləri

Müqavilə mülkü, həm müqavilənin həm oxunmasının, həm də yazılmasının LocalContractStorage-də həyata keçirildiyi bir saxlama əmlakı ilə əlaqələndirilə bilər. Belə bir istiqrazın müəyyənləşdirilməsinin iki üsulu var:

// 'fieldName` deyilən bir obyekt xassəsini təsvirçi ilə obj`-ə bağlayın. // Varsayılan descriptor JSON.parse () / JSON.stringify (). Təsvirçinin "sıfır" və ya "təyin olunmamış" olmasından asılı olmayaraq, standart dəyər istifadə olunur. // geri qaytar. defineProperty (obj, fieldName, [descriptor]); // bir toplu birdən çox xassəni "obj" -ə bağlayın. // geri qaytar. defineProperties (obj, {fieldName1: descriptor1, fieldName2: descriptor2});

Ümumiyyətlə bitləri başlanğıcda saxlamaq üçün müqavilə xüsusiyyətlərini belə göstəririk:

"ciddi istifadə edin";
var BankVaultContract = function () {// Varsayılan təsvir 'null' olduğu üçün istifadə olunur. LocalContractStorage.defineProperty (bu, "name1", boş); // Xüsusi bir descriptor tətbiqi. // Təhlil edildikdə BigNumber obyektini qaytarın. LocalContractStorage.defineProperty (bu, "dəyər1", {stringify: function (obj) {return obj.toString ();}, parse: function (str) {return new BigNumber (str);}}); // Standart serializasiya tətbiqi ilə toplu bağlama. LocalContractStorage.defineProperties (bu, {name2: null, value2: null}); }; module.exports = BankVaultContract;

Bundan sonra bağlama xüsusiyyətlərini birbaşa yaddaşa daxil olmuş kimi oxuya və yaza bilərsiniz:

BankVaultContract.prototype = {init: function (name, value) {// name = "robin", value = 1 this.name1 = name; this.value1 = dəyər; }, testStorage: funksiya (ad, dəyər) {// name = "ROBIN", dəyər = 2 this.name2 = name; this.value2 = dəyər; bool r = this.value1.lessThan (yeni BigNumber (0)); console.log (this.name1 + ":" + r); // Robin: yanlış konsol.log (this.name2 + ":" + this.value2); // ROBIN: 2}};
  • Kart məlumatlarını saxla

Nebulas yaddaşı, silmək, əldə etmək, qurmaq və əsas dəyər məlumatlarının saxlanılması lazım olan bəzi ssenarilər üçün təyin etmək üçün operatorlarla bir kart quruluşunu tətbiq edir. Buna nail olmaq üçün müqavilə əmlakını bir kart olaraq təyin edə bilərsiniz. Bunun üçün iki üsul da var:

// Sadə məcburi, standart descriptor tətbiqi müəyyənləşdirməklə eynidır. // geri qaytar. defineMapProperty (obj, mapName, [descriptor]); // yığın bağlama. // geri qaytar. defineMapProperties (obj, {mapName1: descriptor1, mapName2: descriptor2});

Kartlardan istifadə nümunəsinə nəzər salaq:

'ciddi istifadə edin'; var BankVaultContract = function () {LocalContractStorage.defineMapProperty (bu, "userMap"); LocalContractStorage.defineMapProperty (bu, "userBalanceMap", {stringify: function (obj) {return obj.toString ();}, ayrıştırma: function (str) {return new BigNumber (str);}}); LocalContractStorage.defineMapProperties (bu, {key1Map: null, key2Map: null}); }; BankVaultContract.prototype = {init: function () {}, testStorage: function () {this.userMap.set ("robin", "1"); this.userBalanceMap.set ("robin", yeni BigNumber (1)); }, testRead: function () {// oxumaq və məlumatları saxlamaq var balance = this.userBalanceMap.get ("robin"); this.key1Map.set ("robin", balance.toString ()); this.key2Map.set ("robin", balance.toString ()); }}; module.exports = BankVaultContract;

Blockchain

Blockchain modulu, əməliyyatı almaq və hazırda icra olunan müqavilə daxilində bloklamaq üçün istifadə olunur. Bundan əlavə, NAS müqavilədən götürülə bilər və ünvan doğrulaması təmin edilir.

Blockchain iki xüsusiyyətə malikdir:

  1. Atributlarla müqavilə işlənməsi üçün mövcud bloku blok edin:

- Zaman damgası blok damgası

- hash blok hash

- blok hündürlüyü

2. Əməliyyat atributlarla müqavilənin işlənməsi üçün cari əməliyyat:

- Hash əməliyyat hash

- ünvandan əməliyyatdan

- ünvana edilən əməliyyata

- dəyər əməliyyat dəyəri, müqavilə istifadəsi üçün bir BigNumber obyekti

- Nonce Əməliyyat Nonce

- Zaman damgası əməliyyat damgası

- gasPrice əməliyyatı gasPrice, müqavilə istifadəsi üçün BigNumber obyektidir

- gasLimit əməliyyatı gasLimit, müqavilənin istifadəsi üçün BigNumber obyekti

Və blockchain iki üsul təklif edir:

  1. köçürmə (ünvan, dəyər) NAS-ı müqavilədən ünvana köçürür.
  • param ünvanı: NAS göndəriləcək dumanlıq ünvanı
  • param dəyəri: ötürülmüş dəyər, bir BigNumber obyekti

Dönüşlər: 0 transfer uğurlu, 1 transfer alınmadı.

2. verifyAddress (adres) parametr adresinin etibarlı bir Nebulas ünvanı olub olmadığını yoxlayır.

qayıt: 1 ünvan etibarlı, 0 ünvan etibarsızdır.

Bu modulun sadə bir nümunəsi:

'ciddi istifadə edin'; var BankVaultContract = function () {}; BankVaultContract.prototype = {init: function () {console.log ('init: Blockchain.block.height =' + Blockchain.block.height); console.log ('init: Blockchain.transaction.from =' + Blockchain.transaction.from); }, Transfer: funksiya (ünvan, dəyər) {var result = Blockchain.transfer (ünvan, dəyər); console.log ("köçürmə nəticəsi:", nəticə); }, verifyAddress: function (adres) {var result = Blockchain.verifyAddress (adres); console.log ("verifyAddress result:", nəticə); }}; module.exports = BankVaultContract;

hadisə

Hadisələr modulu müqavilədəki icra hadisələrini qeyd etmək üçün istifadə olunur. Qeydə alınmış hadisələr zəncirdəki hadisə üçlüyündə saxlanılır və bunları icra əməliyyatı qarışığı ilə rpc.getEventsByHash-dən əldə etmək olar. Bütün müqavilə tədbiri mövzularında bir zəncir var. Müqavilə. Xüsusi mövzularla ön əlavə. İstifadəsi:

Event.Trigger (mövzu, obj);
  • mövzu: Xüsusi mövzu
  • obj: JSON obyekti

Budur nümunə:

'ciddi istifadə edin'; var BankVaultContract = function () {}; BankVaultContract.prototype = {init: function () {},
testEvent: function () {// qeyd olunan mövzu əslində "chain.contract.topic" Event.Trigger ("mövzu", {data: {value: "event test."}}); }}; module.exports = BankVaultContract;

konsol

Konsol modulu veb brauzerlər tərəfindən verilən JavaScript konsol mexanizminə bənzər sadə bir deboq konsolu təmin edir. Konsol Nebulas Logger-a göndərilən bütün Args-ləri, çağırılan metodun adına təyin edilmiş müəyyən bir səviyyədə yazdırır.

  • console.log ([… mübahisələr ]) - - Məlumat səviyyəsi
  • console.debug ([… mübahisələr ]) - - Ayıklama səviyyəsi
  • console.warn ([… mübahisələr ]) - - Xəbərdarlıq səviyyəsi
  • console.error ([… mübahisələr ]) - - Xəta səviyyəsi
  • console.info ([… mübahisələr ]) - - console.log üçün taxma adlar ()

İndi aparıcı funksional modullardan bəhs edirik. Sonra, müqavilə funksiyalarını axtarmağa nəzər salaq.

Bir müqaviləni necə aça bilərəm?

Tövsiyə olunan yanaşma, yerli bir qovşaq başlayaraq dumanlığın əsas və ya sınaq şəbəkəsinə qoşulmaqdır. Bunu etmək üçün qısa bir təlimat.

Düyünü başlatdıqdan sonra, əvvəlcə bir müqavilə funksiyasını çağırmadan əvvəl öz hesabınızı unlockAccount () ilə açmalısınız:

// curl tələbi -i -H 'məzmun növü: application / json' -X POST http: // localhost: 8685 / v1 / admin / account / unlock -d '{"address": "n1czGUvbQQton6KUWga4wKDLLKYDEn39mEk", "passphrase": " parol ifadəsi "," duration ":" 1000000000 "} '// Nəticə {" Nəticə ": {" Nəticə ": doğru}}

Daha sonra ağıllı müqaviləyə zəng etmək üçün sendTransaction () metodundan istifadə edə bilərsiniz.

Məsələn, əvvəlki nümunə müqaviləsində testEvent () çağırın:

// Curl -i -H 'Qəbul et: application / json' -X POST http: // localhost: 8685 / v1 / admin /action -H 'Məzmun növü: application / json' -d '{"from": "n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC "," to ":" n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno "," value ":" 100 "," nonce ": 8," gasPrice ":" 1000000 "," gasLimit ":" 2000000 "," contract ": {" function ":" testEvent "," args ":" [] "}} '// Nəticə {" Nəticə ": {" txhash ":" b55358c2e12c1d48d4e6beaee7002a59138294fb2896ea8059ff5277553af59f "," contract_address ":" "}}

RPC təlimatı haqqında daha çox məlumat üçün İstifadəçi və İdarəçi API-sinə baxın.

Nə var?

Növbəti məqalədə Ağıllı Müqavilənin yeni bir xüsusiyyətini təqdim edəcəyik, yəni. H. "Qəbul et" funksiyası.