blog 1HaberlerGeliştiricilerEnterpriseBlockchain AçıklamasıEtkinlikler ve KonferanslarBasınBültenler

Haber bültenimize abone ol.

E

Senin gizliliğine saygı duyuyoruz

AnasayfaBlogBlockchain Geliştirme

Ethereum Akıllı Sözleşmelerinde Olaylar ve Günlüklere Yönelik Kılavuz

Örnek kodlu Joseph Chow ile Ethereum blok zincirindeki olaylar ve günlükler için kullanım durumlarına teknik bir giriş Haziran 6, 2016Yayınlandı 6 Haziran 2016

ConsenSys Signal, ethereum akıllı sözleşmeler kahramanındaki olaylar ve günlükler için bir rehber


Ethereum’da olaylar ve günlükler önemlidir çünkü akıllı sözleşmeler ve kullanıcı arayüzleri arasındaki iletişimi kolaylaştırırlar. Geleneksel web geliştirmede, ön uca yapılan geri aramada bir sunucu yanıtı sağlanır. Ethereum’da, bir işlem çıkarıldığında, akıllı sözleşmeler olayları yayabilir ve ön ucun daha sonra işleyebileceği blok zincirine günlükler yazabilir. Olayları ve günlükleri ele almanın farklı yolları vardır. Bu teknik giriş, olaylarla ilgili bazı karışıklık kaynaklarını ve bunlarla çalışmak için bazı örnek kodları açıklayacaktır..

Olaylar, farklı şekillerde kullanılabildikleri için kafa karıştırıcı olabilir. Biri için bir olay, diğeri için bir olay gibi görünmeyebilir. Olaylar ve günlükler için 3 ana kullanım durumu vardır:

  1. Kullanıcı arayüzü için akıllı sözleşme dönüş değerleri
  2. Verilerle eşzamansız tetikleyiciler
  3. Daha ucuz bir depolama şekli

Olaylar ve günlükler arasındaki terminoloji başka bir kafa karışıklığı kaynağıdır ve bu, üçüncü kullanım durumunda açıklanacaktır..

1) Kullanıcı Arayüzü için Akıllı Sözleşme İade Değerleri

Bir etkinliğin en basit kullanımı, dönüş değerlerini sözleşmelerden bir uygulamanın ön ucuna geçirmektir. Örnek vermek gerekirse, sorun şu:

sözleşme ExampleContract {// bazı durum değişkenleri … function foo (int256 _value) şunu döndürür (int256) {// durumu işle … return _value; }} Kod dili: JavaScript (javascript)

ExampleContract’in bir ExampleContract örneği olduğunu varsayarsak, web3.js kullanan bir ön uç, sözleşme yürütmeyi simüle ederek bir dönüş değeri elde edebilir:

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // 2Code dili: JavaScript (javascript)

Bununla birlikte, web3.js sözleşme çağrısını bir işlem olarak gönderdiğinde, [1] dönüş değerini alamaz:

var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // işlem hashCode dili: JavaScript (javascript)

SendTransaction yönteminin dönüş değeri her zaman oluşturulan işlemin karmasıdır. İşlemler, ön uca bir sözleşme değeri döndürmez çünkü işlemler hemen çıkarılmaz ve blok zincirine dahil edilmez.

Önerilen çözüm, bir olay kullanmaktır ve bu, olayların amaçlanan amaçlarından biridir..

Contract ExampleContract {event ReturnValue (adres endeksli _from, int256 _value); function foo (int256 _value) şunu döndürür (int256) {ReturnValue (msg.sender, _value); geri dönüş değeri; }} Bir ön uç daha sonra dönüş değerini alabilir: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // result.args._from’un web3.eth.coinbase olduğunu kontrol et sonra // kullanıcı arayüzünde sonuç.args._value öğesini görüntüleyin ve // ​​exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) öğesini çağırın Kod dili: JavaScript (javascript)

Foo’yu çağıran işlem çıkarıldığında, saatin içindeki geri arama tetiklenecektir. Bu, ön ucun foo’dan dönüş değerleri elde etmesine etkili bir şekilde izin verir..

2) Verilerle Eşzamansız Tetikleyiciler

Dönüş değerleri, olaylar için minimum kullanım durumudur ve olaylar genellikle verilerle eşzamansız tetikleyiciler olarak kabul edilebilir. Bir sözleşme ön ucu tetiklemek istediğinde, sözleşme bir olay yayınlar. Ön uç olayları izlediğinden, işlem yapabilir, bir mesaj görüntüleyebilir vb. Bir sonraki bölümde bunun bir örneği verilmiştir (kullanıcı para yatırdığında kullanıcı arayüzü güncellenebilir.)

3) Daha Ucuz Bir Depolama Şekli

Üçüncü kullanım durumu, kapsanandan oldukça farklıdır ve bu, olayları önemli ölçüde daha ucuz bir depolama biçimi olarak kullanmaktır. Ethereum Sanal Makinesinde (EVM) ve Ethereum Sarı Kağıt, Olaylar, günlükler olarak adlandırılır (LOG işlem kodları vardır). Depolamadan bahsederken, olaylarda depolanan verilerin aksine, verilerin günlüklerde depolanabileceğini söylemek teknik olarak daha doğru olacaktır. Bununla birlikte, protokolün bir seviyesinin üzerine çıktığımızda, sözleşmelerin ön ucun tepki verebileceği olayları yaydığını veya tetiklediğini söylemek daha doğru olur. Bir olay yayınlandığında, ilgili günlükler blok zincirine yazılır. Olaylar ve günlükler arasındaki terminoloji başka bir kafa karışıklığı kaynağıdır, çünkü bağlam hangi terimin daha doğru olduğunu belirler..

Günlükler, sözleşmeli depolamaya göre önemli ölçüde daha az gaz maliyeti olan bir depolama biçimi olarak tasarlandı. Kayıtlar temelde [2] bayt başına 8 gaza mal olurken, sözleşmeli depolama 32 bayt başına 20.000 gaza mal olur. Günlüklere devasa gaz tasarrufu sağlasa da, günlüklere herhangi bir sözleşmeden erişilemez [3].

Bununla birlikte, günlükleri ön uç için tetikleyiciler yerine ucuz depolama olarak kullanmak için kullanım durumları vardır. Günlüklere uygun bir örnek, ön uç tarafından oluşturulabilen geçmiş verileri depolamaktır..

Bir kripto para birimi değişimi, bir kullanıcıya borsada gerçekleştirdiği tüm para yatırma işlemlerini göstermek isteyebilir. Bu para yatırma ayrıntılarını bir sözleşmede saklamak yerine, günlük olarak saklamak çok daha ucuzdur. Bu mümkündür, çünkü bir borsa, sözleşmeli depoda sakladığı bir kullanıcının bakiyesinin durumuna ihtiyaç duyar, ancak geçmiş mevduatların ayrıntılarını bilmesine gerek yoktur..

CryptoExchange sözleşmesi {event Deposit (uint256 endeksli _market, adres endeksli _sender, uint256 _amount, uint256 _time); fonksiyon depozito (uint256 _amount, uint256 _market) iade (int256) {// para yatırma, kullanıcının bakiyesini güncelleme vb. Para Yatırma (_market, msg.sender, _amount, şimdi); } Kod dili: JavaScript (javascript)

Kullanıcı para yatırırken bir UI’yi güncellemek istediğimizi varsayalım. Verilerle (_market, msg.sender, _amount, şimdi) eşzamansız tetikleyici olarak bir olayı (Depozito) kullanma örneğini burada bulabilirsiniz. CryptoExContract’in bir CryptoExchange örneği olduğunu varsayalım:

var depositEvent = cryptoExContract.Deposit ({_ sender: userAddress}); depositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // result.args’ın ayrıntılarını UI’ye ekle}) Kod dili: JavaScript (javascript)

Etkinlik için _sender parametresinin endekslenmesinin nedeni, bir kullanıcı için tüm olayları alma verimliliğini artırmaktır: event Deposit (uint256 indeksli _market, adres indeksli _sender, uint256 _amount, uint256 _time).

Varsayılan olarak, olayları dinleme, yalnızca olayın somutlaştırıldığı noktada başlar. UI ilk yüklendiğinde, eklenecek para yatırma işlemi yoktur. Bu nedenle, 0 bloğundan beri olayları almak istiyoruz ve bu, olaya bir fromBlock parametresi ekleyerek yapılır..

var depositEventAll = cryptoExContract.Deposit ({_ sender: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); depositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // result.args’ın ayrıntılarını UI’ye ekle}) Kod dili: JavaScript (javascript)

Kullanıcı arabirimi oluşturulduğunda depositEventAll.stopWatching () çağrılmalıdır.

Kenara – Endekslenmiş parametreler

En fazla 3 parametre indekslenebilir. Örneğin, önerilen bir belirteç standardında şunlar bulunur: olay Aktarımı (adres endeksli _from, endeksli adres, _to, uint256 _value). Bu, bir ön ucun yalnızca aşağıdaki belirteç transferlerini verimli bir şekilde izleyebileceği anlamına gelir:

  • tokenContract.Transfer ({_ from: senderAddress}) tarafından gönderilen bir adres
  • veya tokenContract.Transfer ({_ to: receiverAddress}) tarafından alınan
  • veya bir adres tarafından belirli bir adrese gönderilen tokenContract.Transfer ({_ from: senderAddress, _to: receiverAddress})

Sonuç

Olaylar için üç kullanım durumu sunulmuştur. İlk olarak, sendTransaction () ile çağrılan bir sözleşme işlevinden bir dönüş değeri elde etmek için bir olay kullanmak. İkinci olarak, bir olayı verilerle eşzamansız tetikleyici olarak kullanmak, bu da UI gibi bir gözlemciye bildirim gönderebilir. Üçüncüsü, daha ucuz bir depolama biçimi olarak blok zincirinde günlükleri yazmak için bir olay kullanmak. Bu giriş bazılarını gösterdi API’ler etkinliklerle çalışmak için. Var diğer yaklaşımlar olaylar, günlükler ve makbuzlarla çalışmak ve bu konular gelecekteki makalelerde ele alınabilir.

Bu makaleyle ilgili geri bildirimler için Aaron Davis, Vincent Gariepy ve Joseph Lubin’e teşekkürler.

Referanslar

[1] web3.js, işlemin blok zincirine dahil edilmesini izleyebilir, ardından dönüş değerini almak için işlemi EVM’nin bir örneğinde yeniden oynatabilir, ancak bu, web3.js’ye eklenecek önemli miktarda mantıktır.

[2] Bir LOG işlemi için 375 gaz maliyeti ve konu başına 375 gaz maliyeti vardır, ancak birçok bayt depolandığında, bu maliyetler toplam depolama maliyetinin önemsiz bir kısmını temsil eder..

[3] Günlükler için Merkle kanıtları mümkündür, bu nedenle harici bir kuruluş böyle bir kanıtı içeren bir sözleşme sağlarsa, bir sözleşme günlüğün blok zincirinde gerçekten var olduğunu doğrulayabilir.

Geliştirici kılavuzlarının doğrudan gelen kutunuza gelmesini isteyin?

ConsenSys’in geliştirici haber bültenine abone olun

En son Ethereum haberleri, kurumsal çözümler, geliştirici kaynakları ve daha fazlası için haber bültenimize abone olun.Başarılı Bir Blockchain Ürünü Nasıl OluşturulurWeb semineri

Başarılı Bir Blockchain Ürünü Nasıl Oluşturulur

Ethereum Düğümü Nasıl Kurulur ve ÇalıştırılırWeb semineri

Ethereum Düğümü Nasıl Kurulur ve Çalıştırılır

Kendi Ethereum API'nizi Nasıl Oluşturabilirsiniz?Web semineri

Kendi Ethereum API’nizi Nasıl Oluşturabilirsiniz?

Sosyal Simge Nasıl OluşturulurWeb semineri

Sosyal Simge Nasıl Oluşturulur

Akıllı Sözleşme Geliştirmede Güvenlik Araçlarını KullanmaWeb semineri

Akıllı Sözleşme Geliştirmede Güvenlik Araçlarını Kullanma

Finansın Geleceği Dijital Varlıklar ve DeFiWeb semineri

Finansın Geleceği: Dijital Varlıklar ve DeFi

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