Bir Sarma Ağacı öğretici

Editör Notu: Bu hikaye ilk olarak 20 Ocak 2018'de yayınlandı. O zamandan beri, Sarma Ağacı projesi önemli ölçüde ilerlemiş ve https://developers.windingtree.com/ adresinde resmi eğitimler yayınlamıştır. Bu eğitim ve sonuçları çoğunlukla eski, hikaye sadece referans amaçlı tutuluyor.

Seyahat endüstrisinde son zamanlarda gerçekten dikkatimi çeken bir proje var, bu da Sarma Ağacı. Bu açık kaynaklı proje, seyahat endüstrisinin bel kemiğini blok zinciri ile değiştirmekten daha azını hedeflememektedir.

Beyaz sayfalarına göre:

Seyahat endüstrisindeki beş şirket, seyahat pazarının çoğunu kontrol ediyor. ABD'deki Ode pazarının% 95'ini kontrol eden en büyük iki OTA (Online Seyahat Acentesi), Priceline Group ve Expedia Inc. hava piyasasındaki doğrudan olmayan envanter.

Boom, sorun belirtildi. Ve Lufthansa Grubu gibi bazı büyük isimlerle ortak oldular. Seyahat teknolojisi alanında çalışan biri olarak çok sorum var: Proje ekibi trilyon dolarlık bir sektörü nasıl bozmayı planlıyor? Ekonomi nasıl çalışır? Teknoloji zorluklarını nasıl çözüyorlar? Sorularıma cevap almak için ilk elden deneyim almaya, yayımladıkları açık kod ile denemeye karar verdim ve görüşlerimi bir rehberde paylaşmaya karar verdim.

Bu eğitim için, Sarma Ağacı’nın Github’ında bulunan oteller için Minimum Uygun Ürünü (MVP) kullanacağız. Çokça değişmesi bekleniyor ancak bu, teknolojinin potansiyelini anlamak için zaten iyi bir şey.

Amacımız:

  • Blockchain'de bir odalı bir otel yaratın
  • Bu odayı 5 günlüğüne ayırtın.

Akıllı sözleşmelerle etkileşime geçmek için bazı araçlara ihtiyacımız olacak: git, düğüm (≥7.6), npm ve trüf. Zaten sahip değilseniz, sadece ilgili sayfalarındaki talimatları izleyin.

Sözleşmeleri klonlayıp bağımlılıkları kurarız:

$ cd / tmp
$ git klonu https://github.com/windingtree/wt-contracts --recursive
$ cd wt-sözleşmeler
$ npm kurulum

Sözleşmeleri yalnızca canlı blockchain ile etkileşime girmeden test etmek istiyoruz, bu nedenle blockchain'i simüle eden ve bazı avantajlar sağlayan özel bir testrpc sunucusu kullanacağız:

  • Blockchain ile etkileşimde bulunmak için gerçek para ödemek zorunda değiliz.
  • Bilgisayarımızdaki tüm blok zinciri senkronize etmek zorunda değiliz.
  • Madencilik süreçlerini beklememiz gerekmez

Canlı bir ortamda, önce Ethereum hesap adresimizi Ethereum düğümüne içe aktarmamız ve özel anahtarı kullanarak kilidini açmamız gerekir, ancak burada testrpc zaten bizim için ilk hesabın kilidini açtı.

Ayrıca Truffle, enjekte edilmiş bir web3 sağlayıcısına sahip bir Javascript yorumlayıcısına sahiptir, bu yüzden bu eğitimin amacı için kurulumu basitleştireceğiz ve sadece komut satırında Javascript kodunu çalıştıracağız. Aynı kod bir Node.js sunucusu veya bir Web Tarayıcısı tarafından çalıştırılabilir.

Trüf geliştirme konsoluna giriyoruz:

$ trüf mantarı geliştirmek
Truffle Develop http: // localhost: 9545 / 'de başladı
Hesaplar:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
Anımsatıcı: şeker akçaağaç kek şeker puding kremalı bal zengin pürüzsüz parçalamak tatlı tedavi
trüf (geliştirmek)>

Trüf otomatik olarak bir Ethereum düğümünü başlatır ve ücretsiz ETH ile bizim için bazı test hesapları oluşturur (maalesef sadece testrpc örneğimizde geçerlidir) ve anımsatıcıyı ilişkilendirdik. Eğitim süresince, farklı roller için hesapları değiştirmek için uğraşmayacağız: WT Vakfı, Otel Müdürü, Seyahat Acentası.

Sözleşmeleri derleyelim:

> derle
> dağıt

Şimdi Sarma Ağacı sözleşmelerini kullanmaya hazırız!

Sözleşme hiyerarşisini gösteren çok basitleştirilmiş bir şema:

WT Hotel MVP Sözleşme Hiyerarşisi (basitleştirilmiş)

WTIndex sözleşmesi hiyerarşinin kökenindedir ve Sarma Ağacı Vakfı tarafından yaratılmıştır. Bu eğitim için, testrpc örneğimiz tamamen Ethereum blockchain'i simüle eder, böylece sözleşme olmaz ve bunu yapmamız gerekir:

> WTIndex.new (). Sonra (örnek => wt = örnek)

Gerçek bir Ethereum ağında, işlemin bir Ethereum madencisi tarafından toplanmasını, bir bloğa dahil edilmesini ve birkaç kez onaylanmasını beklemeliyiz. Ancak burada sihirli test düğümümüz sayesinde beklemek zorunda değiliz ve hemen sözleşme adresini alabiliriz:

> yazı
'0xf25186b5081ff5ce73482ad761db0eb0d25abfbf'

Harika, WTIndex sözleşmemiz şimdi konuşlandırıldı!

Şimdi WTIndex sözleşmemiz var, bir otel yapalım.

Otel sözleşmeleri, registerHotel () işlevini çağırırken WTIndex sözleşmesi tarafından otomatik olarak oluşturulur. Doğrudan Otel müdürü tarafından konuşlandırılmaları gerekmiyor ve WTIndex’e aitler.

> wt.registerHotel ('Otelim', 'Çok güzel bir otel')

Otelimizin başka fonksiyonlar arayarak yaratıldığını kontrol edebiliriz, örneğin sadece mevcut ethereum hesabından yönettiğimiz otelleri filtrelemek için:

> wt.getHotelsByManager (web3.eth.coinbase)
['0xf2beae25b23f0ccdd234410354cb42d08ed54981']

Otel Sözleşmesi oluşturulmuştur ve adresimiz var. Kolaylık olması için, örneğiyle h değişkeni oluşturalım:

> wt.getHotelsByManager (web3.eth.coinbase) .then (addr => h = Hotel.at (addr [0]))

Ad ve açıklamaya erişebildiğimizi kontrol edelim:

> h.name ()
'Otelim'
> h.description ()
'Çok güzel bir otel'

Harika bir otelimiz var, ama otelimiz tamamen boş. Bu sadece inşaatı başlatmadan araziye sahip olmak gibidir. Şimdi oda oluşturmamız ve odaların nasıl olduğunu açıklamamız gerekiyor.

Bunun için odamız için bir UnitType ve bir Unit yaratacağız. WTIndex sözleşmesiyle oluşturulan Otel için yaptığımızın aksine, bu sözleşmeleri kendimiz dağıtmamız ve Otel adresine mülkiyeti vermemiz gerekir.

Bir Temel Oda yaratalım:

> UnitType.new (h.adresi, 'BASIC_ROOM'). Sonra (i => ut = i)
> Unit.new (adres, 'BASIC_ROOM'). Sonra (i => u = i)

Şimdi Otelinize Unit ve UnitType'ı eklemek için hile, Otel sözleşmesinin adresimize değil, WTIndex sözleşmesine aittir. Değiştirmeye çalışırsak reddediliriz:

> h.addUnitType (ut.address)
Hata: İşlem gerçekleştirilirken VM Özel Durumu: geçersiz opcode

UnitType ve Unit'i eklemek ve genel olarak Otel sözleşmesindeki tüm değişiklikler için callHotel () işlevini kullanmamız gerekir. Neyse ki bu, sadece yönetici olarak bu işlevi çağırabilecek şekilde korunmaktadır:

> wt.callHotel (0, h.contract.addUnitType.getData (ut.address))
> wt.callHotel (0, h.contract.addUnit.getData (u.address))

Rezervasyonları kabul etmek için, otelciler iki seçeneğe sahiptir:

  • Sarma Ağacı ile anında yerli belirteç LIF
  • Diğer ödeme seçenekleri ile bir onay mekanizması ile.

Bu ders için onay mekanizmasını kullanacağız, öyleyse yapalım:

> wt.callHotel (0, h.contract.changeConfirmation.getData (true))

Hepsi hazır! Otelimiz kuruldu ve müşterilerimizden rezervasyon almaya hazırız! Lütfen burada işlemi, işlemi doğal olarak basitleştirdiğimizi, odayı açıklama, aktivite, fiyat, uygunluk, görüntü vb. İle özelleştirmemiz gerekebileceğini unutmayın.

Şimdi bakış açımızı değiştiriyoruz, bir Seyahat Acentası olduğumuzu (veya teknolojiye meraklı bir gezgin!) Olduğumuzu ve yarattığımız otel odasını rezerve edeceğimizi varsayacağız.

Oteller için arama yapmak, çoğaltılmış girişleri engellemek için çok fazla indeksleme gerektirir ve otel fiyatlarını, uygunluklarını ve olanaklarını gezgin beklentileri doğrultusunda bulabilir. Mevcut tasarım, tüm otel adreslerini içeren bir endeksle oldukça basittir, ancak gelecekte daha iyi indeksleme mekanizmalarının mevcut olacağından emin olabiliriz (örneğin, ülkeler ve şehirlerin bulunduğu bir ağaç). Her bir Ethereum düğümünde tüm envanter verileri merkezden dağıtıldığı ve sadece bir okuma erişimi olduğu için, arama tamamen ücretsiz ve hızlıdır. Düşünürseniz, Seyahat Acenteleri ve Oteller için harika bir fırsat!

Bu eğitici kitap için, rezervasyon yapmak istediğimiz oteli ve birimi zaten bulduğumuzu varsayıyoruz (bu kadar kolay bir tane var!).

Sarma Ağacı ekosisteminde rezervasyon iki bölümden oluşur:

  • Konuk detayları ile özel bir tane
  • Rezervasyonu yapılan otelin detayları ve tarihleri ​​ile halka açık olanı.

Özel olan henüz tanımlanmadı, ancak fikir, onun bir JSON yapısı olduğudur. Sarma Ağacı kod deposundan serbestçe ilham alan bu tür bir yapının örneği:

Burada teknik bir detay var: potansiyel olarak tüm oteller aynı veriye ihtiyaç duymayacak ve aynı ödeme yöntemlerini kabul etmeyeceklerdir, böylece Seyahat Acentası hangi alanların zorunlu olduğunu ya da zorunlu olmadığını nasıl bilebilir?

Hotelier tarafından özel verilere dayanarak rezervasyonu kabul etme veya etmeme kararı bu eğitim için geçerli değildir, o yüzden şimdilik sadece rastgele bir dize olarak düşünelim.

Kitabın mekanizması, blok zincir üzerinde asenkron etkileşimlere izin veren Ethereum Olaylarına dayanır. Seyahat Acentası rezervasyon talebini başlatabilir ve bu bir olay yaratır:

> privateData = "PRIVATE_GUEST_DATA"
> publicData = h.contract.book.getData (adres, web3.eth.coinbase, 20150, 5)
> h.beginCall (publicData, privateData) .then (i => beginCalltx = i)

Not: 20150, 1 Ocak 1970’ten sonraki gün sayısıdır: 3 Mart 2025

Otel, rezervasyon etkinlikleri için blok zinciri izleyebilir. Bir etkinlik alındığında, otel genel ve özel bilgileri alabilir:

> abiDecoder = zorunlu ('abi-kod çözücü')
> abiDecoder.addABI (Hotel._json.abi)
> beginCallEvent = abiDecoder.decodeLogs (beginCalltx.receipt.logs) [0]
> beginCalltxCode = web3.eth.getTransaction (beginCalltx.tx) .input
> transferDecoded = abiDecoder.decodeMethod (beginCalltxCode)
> abiDecoder.decodeMethod (transferDecoded.params [0] .value)
{name: 'kitap',
  parametreler:
   [{name: 'unitAddress',
       değer: '0xf25186b5081ff5ce73482ad761db0eb0d25abfbf'
       type: 'address'},
     {name: 'den'
       değer: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
       type: 'address'},
     {name: 'fromDay', değer: '20150', şunu yazın: 'uint256'},
     {name: 'daysAmount', değer: '5', şunu yazın: 'uint256'}]}
> web3.toAscii (transferDecoded.params [1] .value)
'PRIVATE_GUEST_DATA'

Ve rezervasyonu kabul et:

> pendingCallHash = beginCallEvent.events [1] .value
> wt.callHotel (0, h.contract.continueCall.getData (pendingCallHash))

Herkes daha sonra bu odanın rezerve edildiğini ve hangi adrese göre rezerve edildiğini görebilir ve tekrar rezerve edilemez:

> u.getReservation (20150)
[BigNumber {s: 1, e: 0, c: [0]},
  Büyük Sayı {s: 1, e: 0, c: [0]},
  '0x627306090abab3a6e1400e9345bc60c78a8bef57']
> h.beginCall (publicData, privateData)
Hata: İşlem gerçekleştirilirken VM Özel Durumu: geçersiz opcode

Başarı!

Bu derste, Sarma Ağacı MVP Sözleşmesini Otel için nasıl kullanacağımızı gördük ve platformun potansiyelini hissedebildik.

Yine de bazı noktalar hala açık ve Winding Tree ekibi ve topluluğundan daha fazla gelişme gerektiriyor:

  • Ölçeklenebilirlik: Her bir birim türünü ve birimlerini oluşturmak ve bunları yapılandırmak için birden fazla işlem göndermemiz gerektiğinden, bir otel kurmanın mevcut maliyeti oldukça yüksektir (gaz ücretlerinde). Belirli bir odada bazı işler yapılırken envantere sık sık güncelleme yapılması gerekir. Örneğin IPFS veya SWARM'deki sözleşmeden saklanan açıklayıcı bir dosya daha iyi olacaktır. Ayrıca, Alıntı Kanıtı ve Devlet Kanallarına geçişte Ethereum'un bazı genel evrimleri durumu büyük ölçüde iyileştirmelidir.
  • Gizlilik: Mevcut mekanizma ile, misafir özel verilerini almak için ABI Hotel Contract ile göreceli olarak önemsizdir. Örneğe PCI-DSS Uyumluluğu sorusunu gündeme getirmek için bir kredi kartı koyduk. Avrupa'da da GSYİH var. Bu veriler nasıl korunacak? Ayrıca bazı Seyahat Acenteleri iş görüşmeleri neticesinde özel oranlara sahiptir, bu veriler halka açık olmalı mı?
  • Kopyalar ve Sahte listeler: Hiçbir şey kötü bir oyuncunun sahte bir Dizin oluşturmasını, sahte Oteller yapmasını engellemez. Hatta okunaklı görünmesi için bir sürü sahte kitap bile üretebilirler. Seyahat Acentası ve nihayetinde gezgin bu durumdan nasıl korunmaktadır? Burada hiçbir şeyin olmadığını ya da en kötüsünün bulunmadığını bulmak için bir Otele seyahat edenlerin kabul etmesi kabul edilemez. Herhangi bir ciddi uygulamanın, fiziksel dünyada var olan bir otel için iyi bir sözleşme adresine sahip olmalarını sağlamak için büyük miktarda önlem alınması gerekecektir.

Benim kişisel görüşüm, platformun kendi içinde birçok zorluk olsa bile işe yaradığı yönünde. Platform önümüzdeki yıllarda Seyahat Sektörü'nü tamamen bozabilir, bekle ve gör!