Son iki makaledeki (Burada ve Burada) sağlamlık akıllı sözleşme tasarımı ve konularla ilgili bazı tartışmalardan sonra, akıllı sözleşmeleri kurumsal müşteri uygulamalarıyla nasıl entegre edebileceğimize bir göz atacağız. Bir ethereum düğümü (ethereum blockchain istemcisi) ile etkileşime girebilen birden fazla teknoloji vardır..

Akıllı sözleşmeleri çalıştıran EVM’nin (ethereum sanal makine) temel mimarisi, sözleşmeye yapılan tüm çağrıların, yürütülen bir sözleşme yöntemi için gerekli eterin, arayan hesap adresinden sözleşme hesabı adresine aktarıldığı bir işlem olarak yürütülmesidir. Sözleşme kodu, blok zincirindeki sözleşme adresinde bulunur ve çağrıların, işlemle birlikte “girdi” olarak yöntem parametre verilerini taşıyan işlemler olarak gelmesini bekler. Tüm istemciler için standart bir biçimi etkinleştirmek için, yöntem adı ve parametrelerin önerilen bir biçimde sıralanması gerekir..

Ethereum Akıllı Sözleşme İstemcilerine Giriş (Web3js Kitaplığı)

JSON-RPC

ethereum standart istemcileri, RPC’yi (Uzaktan Prosedür Çağrısı) blok zincirinde konuşlandırılan sözleşme kodu yapmak için bir arayüz ortaya çıkarır. Bu, go, c ++ ve eşlik istemcisi için varsayılan 8545 bağlantı noktasında HTTP gönderi istekleri olarak hizmet veren RPC arabirimi olarak adlandırılır. Bu genellikle bir komut parametresi veya bir yapılandırma dosyası özelliği olarak özelleştirilebilir:

–rpc –rpcaddr <ip> –rpcport <Port numarası>

Popüler olmak üzere yapılandırılmış RPC biçimi JSON-RPC biçim. Biçim, özellikle türlere dayalı olarak parametre değerlerini sıralamak için karmaşıktır. EVM’nin bunları çözebilmesini sağlamak için, önerilen kodlama şeması doğru dolgu ile tanımlandığı şekilde takip edilmelidir..

JSON_RPC formatının düşük seviyeli karmaşıklığından dolayı, çağrı formatını basitleştiren bir dizi sarıcı kitaplık mevcuttur. En eskisi bir JavaScript sarmalayıcısıdır web3.js tarayıcıda ve bir nodejs örneğinde çalışır. Bu tartışma, tüm API tanımları için referans belgenin yerini almayı amaçlamaz, lütfen belirli API çağrıları için yukarıdaki bağlantıya bakın. Burada, akıllı sözleşme için tarayıcı tabanlı bir istemci uygulamaya yönelik öneri oluşturmak için belirli bir API kümesi kullanacağız..

Web3.js’yi yükleyin

Web3’ü düğüm, tarayıcı veya meteor paketi olarak kurmak için yukarıdaki github talimatını izleyin. -G ile bir düğüm modülü kurmanız durumunda, / usr / lib / node_modules / web3 yoluna kurulur. Lütfen bu dizinin aşağıdaki yapıda bağımlılıklar ile mevcut olduğundan emin olun (Bu, Linux işletim sistemi için test edilmiştir, lütfen işletim sisteminize özgü yolunuz için işletim sisteminize özgü nodejs belgelerine bakın), bu, nodejs çalışma zamanının tüm bağımlı kütüphaneler.

/ usr / lib / node_modules / web3

├── bower.json

├── bundled.js

├── circle.yml

├── coder.js

├── dist

│ ├── web3.js

│ ├── web3.js.map

│ ├── web3-light.js

│ ├── web3-light.min.js

│ └── web3.min.js

├── örnek

│ ├── balance.html

│ ├── contract_array.html

│ ├── contract.html

│ ├── event_inc.html

│ ├── icap.html

│ ├── namereg.html

│ └── node-app.js

├── gulpfile.js

├── index.js

├── lib

│ ├── sözleşmeler

│ │ ├── GlobalRegistrar.json

│ │ ├── ICAPRegistrar.json

│ │ └── SmartExchange.json

│ ├── sağlamlık

│ │ ├── address.js

│ │ ├── bool.js

│ │ ├── bytes.js

│ │ ├── coder.js

│ │ ├── dynamicbytes.js

│ │ ├── formatters.js

│ │ ├── int.js

│ │ ├── param.js

│ │ ├── real.js

│ │ ├── string.js

│ │ ├── type.js

│ │ ├── uint.js

│ │ └── ureal.js

│ ├── aletler

│ │ ├── browser-bn.js

│ │ ├── browser-xhr.js

│ │ ├── config.js

│ │ ├── sha3.js

│ │ └── utils.js

│ ├── version.json

│ ├── web3

│ │ ├── allevents.js

│ │ ├── batch.js

│ │ ├── contract.js

│ │ ├── errors.js

│ │ ├── event.js

│ │ ├── expand.js

│ │ ├── filter.js

│ │ ├── formatters.js

│ │ ├── function.js

│ │ ├── httpprovider.js

│ │ ├── iban.js

│ │ ├── ipcprovider.js

│ │ ├── jsonrpc.js

│ │ ├── method.js

│ │ ├── yöntemler

│ │ │ ├── db.js

│ │ │ ├── eth.js

│ │ │ ├── net.js

│ │ │ ├── kişisel.js

│ │ │ ├── shh.js

│ │ │ ├── swarm.js

│ │ │ └── watch.js

│ │ ├── namereg.js

│ │ ├── property.js

│ │ ├── requestmanager.js

│ │ ├── settings.js

│ │ ├── syncing.js

│ │ └── transfer.js

│ └── web3.js

├── LİSANS

├── düğüm_modülleri

│ ├── bignumber.js

│ │ ├── bignumber.js

│ │ ├── bignumber.js.map

│ │ ├── bignumber.min.js

│ │ ├── bower.json

│ │ ├── doc

│ │ │ └── API.html

│ │ ├── LİSANS

│ │ ├── package.json

│ │ └── README.md

│ ├── crypto-js

│ │ ├── aes.js

│ │ ├── bower.json

│ │ ├── cipher-core.js

│ │ ├── CONTRIBUTING.md

│ │ ├── core.js

│ │ ├── crypto-js.js

│ │ ├── dokümanlar

│ │ │ └── QuickStartGuide.wiki

│ │ ├── enc-base64.js

│ │ ├── enc-hex.js

│ │ ├── enc-latin1.js

│ │ ├── enc-utf16.js

│ │ ├── enc-utf8.js

│ │ ├── evpkdf.js

│ │ ├── format-hex.js

│ │ ├── format-openssl.js

│ │ ├── hmac.js

│ │ ├── hmac-md5.js

│ │ ├── hmac-ripemd160.js

│ │ ├── hmac-sha1.js

│ │ ├── hmac-sha224.js

│ │ ├── hmac-sha256.js

│ │ ├── hmac-sha384.js

│ │ ├── hmac-sha3.js

│ │ ├── hmac-sha512.js

│ │ ├── index.js

│ │ ├── lib-typedarrays.js

│ │ ├── LİSANS

│ │ ├── md5.js

│ │ ├── mode-cfb.js

│ │ ├── mode-ctr-gladman.js

│ │ ├── mode-ctr.js

│ │ ├── mode-ecb.js

│ │ ├── mode-ofb.js

│ │ ├── package.json

│ │ ├── pad-ansix923.js

│ │ ├── pad-iso10126.js

│ │ ├── pad-iso97971.js

│ │ ├── pad-nopadding.js

│ │ ├── pad-pkcs7.js

│ │ ├── pad-zeropadding.js

│ │ ├── pbkdf2.js

│ │ ├── rabbit.js

│ │ ├── rabbit-legacy.js

│ │ ├── rc4.js

│ │ ├── README.md

│ │ ├── ripemd160.js

│ │ ├── sha1.js

│ │ ├── sha224.js

│ │ ├── sha256.js

│ │ ├── sha384.js

│ │ ├── sha3.js

│ │ ├── sha512.js

│ │ ├── tripledes.js

│ │ └── x64-core.js

│ ├── utf8

│ │ ├── LİSANS-MIT.txt

│ │ ├── package.json

│ │ ├── README.md

│ │ └── utf8.js

│ ├── xhr2

│ │ ├── Cakefile

│ │ ├── CONTRIBUTING.md

│ │ ├── lib

│ │ │ ├── browser.js

│ │ │ └── xhr2.js

│ │ ├── LICENSE.txt

│ │ ├── package.json

│ │ ├── README.md

│ │ ├── src

│ │ │ ├── 000-xml_http_request_event_target.coffee

│ │ │ ├── 001-xml_http_request.coffee

│ │ │ ├── hataları.

│ │ │ ├── progress_event.coffee

│ │ │ └── xml_http_request_upload.coffee

│ │ └── testi

│ │ ├── fikstürler

│ │ │ ├── hello.json

│ │ │ ├── hello.txt

│ │ │ └── xhr2.png

│ │ ├── html

│ │ │ └── browser_test.html

│ │ └── src

│ │ ├── events_test.coffee

│ │ ├── event_target_test.coffee

│ │ ├── headers_test.coffee

│ │ ├── yardımcılar

│ │ │ ├── browser_mocha_runner.coffee

│ │ │ ├── browser_mocha_setup.coffee

│ │ │ ├── setup.coffee

│ │ │ └── xhr_server.coffee

│ │ ├── nodejs_set_test.coffee

│ │ ├── redirect_test.coffee

│ │ ├── response_type_test.coffee

│ │ ├── responseurl_test.coffee

│ │ ├── send_test.coffee

│ │ ├── status_test.coffee

│ │ └── xhr_test.coffee

│ └── xmlhttprequest

│ ├── lib

│ │ └── XMLHttpRequest.js

│ ├── LİSANS

│ ├── package.json

│ └── README.md

├── package-init.js

├── package.js

├── package.json

├── README.md

├── styleguide.md

└── iplik kilidi

Nodejs Web3js çalıştırma

Nodejs, popüler bir sunucu tarafı javascript çalışma zamanı çerçevesidir. Çok sayıda ara yazılım projesini destekler, nodej’lerin akıllı sözleşmelerle etkileşime girmesini sağlamak mantıklıdır. Platformunuza nodej’leri nasıl yükleyeceğiniz konusunda lütfen bazı düğüm belgelerine bakın.

Web3 kurulumunuzu düğüm ortamı ile test etmek için. Lütfen aşağıdaki kodu bir js dosyasına kaydedin ve düğüm çalışma zamanınızda çalıştırın. Lütfen 8545 numaralı bağlantı noktasındaki yerel makinede çalışan bir ethereum düğümünüz olduğundan emin olun (veya yapılandırdığınız ile değiştirin – özel bir düğüm kurma hakkındaki önceki makaleye bakın).

console.log ("Başlangıç…");

var Web3 = required (‘/ usr / lib / node_modules / web3’);

web3 = yeni Web3 (yeni Web3.providers.HttpProvider (‘http: // localhost: 8545’));

console.log (web3.eth.accounts);

Kurulumda herhangi bir sorun yoksa, aşağıdaki çıktı olacaktır:

local @ local-Lenovo-G50-70: / nodeinstall / node $ node eth.js

Başlangıç…

[‘0x81c95efa213ed798cc99e80f79eece314f76fbe8’]

local @ local-Lenovo-G50-70: / nodeinstall / node $

Bu, ethereum düğümünde bulunan hesap dizisini yazdırıyor. (Şu anda bu durumda sadece bir tane var) .

Aşağıdaki bölümlerde tartışacağımız tüm web3 özellikleri, node ortamında da mevcut olacaktır. Bundan sonra, tarayıcı tabanlı yürütmeye odaklanacağız, düğüm örneğinizde herhangi bir özel sorunla karşılaşırsanız lütfen benimle iletişime geçin.

In – Tarayıcı Web3js çalışır

Web3, sözleşmeleriniz için kullanıcı arabirimi oluşturmak üzere tarayıcınızın html koduna aktarılabilir. İstemci tarayıcı makinesinin bağlanması için RPC arayüzünüzü açığa çıkarmayacağınız için bu yaklaşım önerilmez. Genellikle, tarayıcı yerine ethereum düğümünüze bağlanan bir kurumsal uygulamaya sahip olursunuz. Bu nedenle nodejs ile yaptığımız test önemlidir. Ethereum akıllı sözleşmeleriyle bağlantı kurması gereken java gibi başka eski teknolojiler de var. JSON-RPC biçimini belirtildiği gibi izlersek, her teknolojide sarmalayıcı kitaplıkları oluşturmanın yolları vardır. Bununla birlikte, bir ethereum istemcisinin sağladığı tüm olanakları ve özellikleri görmek için tarayıcı içi javascript ortamına bağlı kalacağız..

Web3 js’yi içe aktaran ve basit bir sözleşme çağrısı yapan basit bir HTML sayfası görelim.

&lt; html&gt;

&lt; kafa&gt;

&lt; başlık&gt; eth web3 için test cihazı&lt; / başlık&gt;

&lt; script src ="https://static.blockgeeks.com/usr/lib/node_modules/web3/lib/web3.js"&gt;&lt; / script&gt;

&lt; komut dosyası&gt;

&nbsp;

function start () {

var Web3 = gerekli (‘web3’);

var web3 = yeni Web3 ();

web3.setProvider (yeni web3.providers.HttpProvider (‘http: // localhost: 8545’));

var abi = […];

var corecontractContract = web3.eth.contract (abi);

var corecontractContractInst = corecontractContract

.(‘0x0e22a4f27c2fc3b47e66b70fada85e1c4ca33681’); console.log (corecontractContract.createCustomer (287187, “custName”, 13243244,1213334));

}

&lt; / script&gt;

&lt; / kafa&gt;

&lt; body onload ="Başlat();"&gt;

&lt; vücut&gt;

&lt; / html&gt;

Web3.js, düğüm modülü kurulumundaki lib klasöründen doğrudan içe aktarılabilir. Küçültülmüş sürümü kullanmanız önerilir, ancak tarayıcıdan kitaplıkta hata ayıklayabilmek için test için genişletilmiş sürümü kullanıyorum. Lütfen kodunuzu değiştirmeden yukarıdaki kodu kopyalayıp yapıştırmayın ve ABI sözleşmenizi ve createCustomer yöntemi çağrınıza bir işlem nesnesi eklemeyin.

ABI sözleşmesi

Sözleşmeyi anlamak için hızlı bir segment yapmalıyız ABI (Uygulama İkili Arayüzü). Sözleşme ABI belirtimi, sözleşme yönteminin ve değişken imzaların bir JSON dizisidir. ABI, bir sözleşme yöntemini tetikleyen işlem için girdinin bir parçasını oluşturduğu için her parametre türü için gereken kodlamayı tanımlar..

Göreceğiniz gibi, sözleşmenizi derlemek için Remix tarayıcı uygulamasını kullandığınız son makalede, uygulama tarafından oluşturulan bir ABI vardı. Veri sözleşmesi için ABU şuna benziyordu:

[{"sabit":doğru,"girişler": [],"isim":"Miktar","çıktılar": [{"isim":"","tip":"uint256"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"aday","tip":"adres"}, {"isim":"yöntem","tip":"dizi"}],"isim":"isUserAuthorized","çıktılar": [{"isim":"","tip":"bool"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [{"isim":"","tip":"uint256"}],"isim":"kullanıcılar","çıktılar": [{"isim":"","tip":"adres"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [],"isim":"öldürmek","çıktılar": [],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"kullanıcı","tip":"adres"}],"isim":"Kullanıcı Ekle","çıktılar": [],"ödenebilir":doğru,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"aday","tip":"adres"}, {"isim":"yöntem","tip":"dizi"}],"isim":"isUser","çıktılar": [{"isim":"","tip":"bool"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [{"isim":"ben","tip":"uint256"}],"isim":"getIthUser","çıktılar": [{"isim":"","tip":"adres"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"indeks","tip":"uint256"}, {"isim":"isim","tip":"dizi"}],"isim":"updateCustomer","çıktılar": [],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"ben","tip":"uint256"}],"isim":"deleteIthUser","çıktılar": [],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [],"isim":"sahip","çıktılar": [{"isim":"","tip":"adres"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"indeks","tip":"uint256"}, {"isim":"statü","tip":"uint256"}],"isim":"updateCustomerStatus","çıktılar": [],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":yanlış,"girişler": [{"isim":"İD","tip":"uint256"}, {"isim":"isim","tip":"dizi"}, {"isim":"doğum tarihi","tip":"uint256"}, {"isim":"sosyal","tip":"uint256"}],"isim":"createCustomer","çıktılar": [],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [],"isim":"getUserCount","çıktılar": [{"isim":"","tip":"uint256"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [{"isim":"indeks","tip":"uint256"}],"isim":"getCustomer","çıktılar": [{"isim":"İD","tip":"uint256"}, {"isim":"isim","tip":"dizi"}, {"isim":"doğum tarihi","tip":"uint256"}, {"isim":"sosyal","tip":"uint256"}, {"isim":"statü","tip":"uint256"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"sabit":doğru,"girişler": [{"isim":"İD","tip":"uint256"}],"isim":"getCustomerById","çıktılar": [{"isim":"idRet","tip":"uint256"}, {"isim":"isim","tip":"dizi"}, {"isim":"doğum tarihi","tip":"uint256"}, {"isim":"sosyal","tip":"uint256"}, {"isim":"statü","tip":"uint256"}],"ödenebilir":yanlış,"tip":"işlevi"}, {"anonim":yanlış,"girişler": [{"indekslenmiş":yanlış,"isim":"etkinlik tipi","tip":"dizi"}, {"indekslenmiş":yanlış,"isim":"İD","tip":"uint256"}],"isim":"Uyarmak","tip":"Etkinlik"}, {"anonim":yanlış,"girişler": [{"indekslenmiş":doğru,"isim":"tarafından","tip":"adres"}, {"indekslenmiş":doğru,"isim":"erişim süresi","tip":"uint256"}, {"indekslenmiş":yanlış,"isim":"yöntem","tip":"dizi"}, {"indekslenmiş":yanlış,"isim":"azalan","tip":"dizi"}],"isim":"LogAccess","tip":"Etkinlik"}]

Gördüğünüz gibi süper sözleşmeden ve imza, parametreler ve iade türleri ile mevcut sözleşmeden gelen yöntemlere sahiptir. Bu, sözleşmenin bir planını veya sınıfını oluşturmak için sözleşme (abi) yapıcısına doğrudan bir json dizisi olarak iletilmelidir..

var abi = […];

var corecontractContract = web3.eth.contract (abi);

Bu mekanizma, herhangi bir yöntemin doğrudan sözleşme sınıfının örneğinde çağrılabilmesini sağlar. Sonraki ifade, corecontractContract sözleşme sınıfının bir örneğini oluşturur

var corecontractContractInst = corecontractContract

.(‘0x0e22a4f27c2fc3b47e66b70fada85e1c4ca33681’);

Artık sözleşme, sözleşme kodunun “kurulu” olduğu adrese bağlıdır. Şimdi sözleşmede yöntemler arayabiliriz.

corecontractContract.createCustomer (287187, “custName”, 13243244,1213334);

Bu çağrı, sözleşmeye sunulan işlemin işlem karmasını döndürecektir.

Ek parametreler:

Yöntem parametresiyle birlikte, çağrı, yöntem çağrısı içinde işlevsel olmayan ek parametrelerin geçmesine izin verir..

İşlem nesnesi (Bu, bazı ek yorumlarla birlikte referans belgedeki işlem nesnesi tanımının bir kopyasıdır):

from: String – Gönderen hesabın adresi. Kullanır web3.eth.default Hesabı özellik, belirtilmemişse. Varsayılan hesap özelliği, başlatma aşamasında web3.eth.defaultAccount = web3.eth.accounts [0]; Bu, hesaplar dizisindeki ilk hesabı kullanacağımızı gösterir, işlem için gerekli olan gaz bu hesaptan düşülür.

kime: Dize – (isteğe bağlı) Bir sözleşme oluşturma işlemi için tanımsız bırakılan mesajın hedef adresi. Bu nedenle, akıllı sözleşme çağrıları için işlem nesnesini kullandığımız durumumuz için buna gerek yoktur.

değer: Number | String | BigNumber – (isteğe bağlı) Wei’deki işlem için aktarılan değer, ayrıca bir sözleşme oluşturma işlemi ise bağış. Bir sözleşme oluşturmadığımız için (zaten dağıtıldı.

gas: Number | String | BigNumber – (isteğe bağlı, varsayılan: Belirlenecek) İşlem için kullanılacak gaz miktarı (kullanılmayan gaz iade edilir). Bu bizim durumumuzda önemlidir, çünkü bir miktar gazı geçirmemiz gerekir, böylece sözleşme güncelleme yöntemi, yürütmeyi tamamlamak için gerekli gazı alır. Yöntem başına tahmini gaz, remix uygulamasında mevcuttur, işlemimizin “yeterli gaz yok” hatası nedeniyle başarısız olmaması için tam sayıya yükseltilen bu değeri kullanmamız gerekir.

gasPrice: Number | String | BigNumber – (isteğe bağlı, varsayılan: Belirlenecek) Bu işlem için wei cinsinden gaz fiyatı, varsayılan olarak ortalama ağ gaz fiyatıdır.

data: String – (isteğe bağlı) Ya a bayt dizesi mesajın ilişkili verilerini veya bir sözleşme yaratma işlemi durumunda, başlatma kodunu içerir. Bizim durumumuz bir dağıtım çağrısı olmadığı için buna gerek yok.

nonce: Number – (isteğe bağlı) Bir tamsayı. Bu, aynı nonce kullanan kendi bekleyen işlemlerinizin üzerine yazmanıza izin verir.

Sürekli çağrı Vs. İşlem çağrısı

Bir sözleşmenin sağlamlık kodunda uygulandığı gibi iki tür çağrısı olabilir. Sabit bir çağrı sözleşme durumunu değiştirmez, yalnızca blok zincirini okur ve mantığına göre filtrelediği değerleri döndürür. Bu tür bir çağrının yürütülmesi için herhangi bir etere gerek yoktur, bu nedenle sözleşme yöntemi çağrımızda herhangi bir gas parametresi geçirmemize gerek yoktur. Örneğin.

console.log (corecontractContractInst.getCustomer (0));

Bu, uintler için bir BigNumber dizisi döndürür:

[Büyük sayı, "aCust", BigNumber, BigNumber, BigNumber]

BigNumbers ondalık sayıya dönüştürmek için toDecimal (BigNumber) yardımcı program yöntemini kullanın:

console.log (web3.toDecimal (corecontractContractInst.getCustomer (0) [0]));

Bu çağrı, blok zincirinde bir işlem oluşturmaz.

Bir İşlem çağrısı, burada DataContract’ta müşteri eşlemesine ilişkin bir kayıt oluşturmak gibi sözleşme durumunu güncellemeyi amaçlamaktadır..

corecontractContract.createCustomer (287187, “custName”, 13243244,1213334);

Bu çağrı bir işlemle sonuçlanacak ve biraz gaz tüketecektir. İşlem nesnesi kullanılarak işlemle birlikte gaz tedarik edilebilir:

console.log (corecontractContractInst.createCustomer (133423, ‘aCust’, 3334,454545), {gas: 20000});

Buradaki 20000 keyfi, lütfen Remix uygulamasındaki yöntem yürütmeden tahmin edilen gazı kullanın. Gaz miktarı EVM tarafından beklenenden düşükse, hatalar alırsınız:

Yakalanmamış Hata: İşlem gazı çok düşük. İşlemin minimum maliyetini karşılayacak yeterli gaz yok (minimum: 22680, var: 20000). Sağlanan gazı artırmayı deneyin.

Object.InvalidResponse adresinde (web3.js: 3120)

RequestManager.send (web3.js: 6043) adresinde

0});

Filtreler:

Sağlamlık sözleşmesinden oluşturduğumuz olaylar Web3 katmanından dinlenebilir. Kütüphane, blok zincirinde kaydedilen olayları aramak için bir sorgulama mekanizması izler ve eğer herhangi bir üretilirse onu web3 katmanına kabarcıklar..

ACLContract kodunda erişim kontrolü ile ilgili bazı olaylar oluşturduk. AllEvents () API ile abone olarak herhangi bir müşteri çağrısından üretilen olayları dinleyebiliriz..

var olaylar = corecontractContractInst.allEvents ();

// değişiklikleri izleyin

events.watch (function (hata, olay) {

eğer (! hata)

console.log (JSON.stringify (olay));

});

Bu, aşağıdaki gibi olayları çıkaracaktır:

{"adres":"0x969f563858ddef891e32de8d8c9232f6f74103d0","blockHash":"0x9c44f138a2f1b3aa4a6457252e62fff56257329d17261901048b1d50176e39b4","blockNumber": 47,"logIndex": 0,"transactionHash":"0xb4ca62b604c9cd43a0125703c07c8a1624963a8fd399b38f943357549f96c90a","transactionIndex": 0,"transactionLogIndex":"0x0","tip":"mayınlı","Etkinlik":"LogAccess","argümanlar": {"tarafından":"0x81c95efa213ed798cc99e80f79eece314f76fbe8","erişim süresi":"1494178629","yöntem":"createCustomer","azalan":"başarılı erişim"}}

{"adres":"0x969f563858ddef891e32de8d8c9232f6f74103d0","blockHash":"0x9c44f138a2f1b3aa4a6457252e62fff56257329d17261901048b1d50176e39b4","blockNumber": 47,"logIndex": 0,"transactionHash":"0xb4ca62b604c9cd43a0125703c07c8a1624963a8fd399b38f943357549f96c90a","transactionIndex": 0,"transactionLogIndex":"0x0","tip":"mayınlı","Etkinlik":"LogAccess","argümanlar": {"tarafından":"0x81c95efa213ed798cc99e80f79eece314f76fbe8","erişim süresi":"1494178629","yöntem":"createCustomer","azalan":"başarılı erişim"}}

Yukarıdakiler, createCustomer iki kez çağrıldığında oluşturulan iki olaydır. Birden fazla kaynak JSON-RPC çağrıları aracılığıyla sözleşme çağrılarını kullanarak olayları oluştururken, tek bir aboneden olayları almak mümkündür. Bu, denetim verilerini yakalamak için tek bir uygulama oluşturmayı sağlar.

Yukarıdaki tartışmada, javascript istemcisinin bazı temellerine değindik. Bir sonraki bölümde, web3 kitaplığı aracılığıyla işlevler için test kodunun nasıl yazılacağı, Truffle çerçevesini kullanarak eksiksiz bir Dapp oluşturma ve daha fazlası gibi bazı gelişmiş kavramlara bakacağız.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me