Hướng dẫn quanh co

Lưu ý của biên tập viên: Câu chuyện này ban đầu được xuất bản vào ngày 20 tháng 1 năm 2018. Kể từ đó, dự án Winding Tree đã tiến triển đáng kể và xuất bản các hướng dẫn chính thức trên https://developers.windingtree.com/. Hướng dẫn này và kết luận của nó chủ yếu là lỗi thời, câu chuyện chỉ được giữ lại để tham khảo.

Có một dự án thực sự gây chú ý trong ngành du lịch gần đây là Winding Tree. Dự án nguồn mở này nhằm mục đích không gì khác hơn là thay thế xương sống của ngành du lịch bằng một blockchain.

Theo sách trắng của họ:

Năm công ty trong ngành du lịch kiểm soát hầu hết thị trường du lịch. Hai OTA lớn nhất (Cơ quan Du lịch Trực tuyến), Tập đoàn Priceline và Expedia Inc., kiểm soát 95% thị trường OTA tại Hoa Kỳ Amadeus, Saber và Travelport, ba GDS hàng đầu (Hệ thống phân phối toàn cầu), có 99% thị phần kết hợp trong hàng tồn kho không trực tiếp trên thị trường hàng không.

Bùng nổ, vấn đề nêu. Và họ hợp tác với một số tên tuổi lớn như Lufthansa Group. Là một người làm việc trong lĩnh vực công nghệ du lịch, tôi đã có rất nhiều câu hỏi: làm thế nào nhóm dự án có kế hoạch phá vỡ một ngành công nghiệp nghìn tỷ đô la? Kinh tế làm việc như thế nào? Làm thế nào để họ giải quyết các thách thức công nghệ? Để có được câu trả lời cho câu hỏi của mình, tôi đã quyết định trải nghiệm trực tiếp, thử nghiệm mã nguồn mở mà họ đã phát hành và chia sẻ phản hồi của tôi trong một hướng dẫn.

Đối với hướng dẫn này, chúng tôi sẽ sử dụng Sản phẩm khả thi tối thiểu (MVP) cho các khách sạn có sẵn trên Winding Tree Nott Github. Dự kiến ​​sẽ thay đổi rất nhiều nhưng điều đó đã tốt để hiểu được tiềm năng của công nghệ.

Mục tiêu của chúng tôi sẽ là:

  • Tạo một khách sạn trên blockchain với một phòng
  • Đặt phòng này trong 5 ngày.

Chúng ta sẽ cần một số công cụ để tương tác với các hợp đồng thông minh: git, nút (≥7.6), npm và truffle. Nếu bạn không có họ, hãy làm theo hướng dẫn từ các trang tương ứng của họ.

Chúng tôi nhân bản hợp đồng và cài đặt các phụ thuộc:

$ cd / tmp
$ git clone https://github.com/windingtree/wt-contuces --recursive
$ cd wt-hợp đồng
$ npm cài đặt

Chúng tôi chỉ muốn kiểm tra các hợp đồng mà không thực sự tương tác với blockchain trực tiếp, vì vậy chúng tôi sẽ sử dụng một máy chủ testrpc cụ thể mô phỏng blockchain và mang lại một số lợi ích:

  • Chúng tôi không phải trả tiền thật để tương tác với blockchain,
  • Chúng tôi không phải đồng bộ hóa tất cả các blockchain trên máy tính của mình,
  • Chúng ta không cần đợi quá trình khai thác

Trong môi trường trực tiếp, trước tiên chúng tôi cần nhập địa chỉ tài khoản Ethereum của chúng tôi trên nút Ethereum và mở khóa bằng khóa riêng, nhưng ở đây testrpc đã mở khóa tài khoản đầu tiên cho chúng tôi.

Ngoài ra Truffle có trình thông dịch Javascript với nhà cung cấp web3 được chèn, vì vậy với mục đích của hướng dẫn này, chúng tôi sẽ đơn giản hóa việc thiết lập và chỉ thực thi mã Javascript trong dòng lệnh. Mã tương tự có thể được chạy bởi máy chủ Node.js hoặc trong Trình duyệt web.

Chúng tôi vào bảng điều khiển phát triển truffle:

$ truffle phát triển
Phát triển Truffle bắt đầu tại http: // localhost: 9545 /
Tài khoản:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fefef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
Mnemonic: kẹo maple cake đường pudding kem mật ong giàu mịn giòn ngọt
nấm cục (phát triển)>

Truffle tự động khởi động một nút Ethereum và tạo một số tài khoản thử nghiệm cho chúng tôi với ETH miễn phí (không may chỉ có hiệu lực trong trường hợp testrpc của chúng tôi) và chúng tôi có liên kết ghi nhớ. Trong hướng dẫn, chúng tôi sẽ không bận tâm thay đổi tài khoản cho các vai trò khác nhau: WT Foundation, Quản lý khách sạn, Đại lý du lịch.

Hãy cùng biên soạn các hợp đồng:

> biên dịch
> triển khai

Bây giờ chúng tôi đã sẵn sàng để bắt đầu sử dụng các hợp đồng Winding Tree!

Dưới đây là một sơ đồ rất đơn giản cho thấy hệ thống phân cấp hợp đồng:

WT Hotel MVP Hợp đồng phân cấp (đơn giản hóa)

Hợp đồng WTIndex là gốc rễ của hệ thống phân cấp và được tạo ra bởi Winding Tree Foundation. Đối với hướng dẫn này, ví dụ testrpc của chúng tôi mô phỏng hoàn toàn chuỗi khối Ethereum để hợp đồng không tồn tại và chúng tôi cần tạo ra nó:

> WTIndex.new (). Sau đó (dụ => wt = dụ)

Trong một mạng Ethereum thực sự, bây giờ chúng ta nên chờ đợi giao dịch được chọn bởi một người khai thác Ethereum, bao gồm nó trong một khối và được xác nhận nhiều lần. Tuy nhiên, ở đây nhờ vào nút testrpc ma thuật của chúng tôi, chúng tôi không phải chờ đợi và chúng tôi có thể nhận được địa chỉ hợp đồng ngay lập tức:

> wt.address
'0xf25186b5081ff5ce73482ad761db0eb0d25abfbf'

Tuyệt vời, hợp đồng WTIndex của chúng tôi hiện đã được triển khai!

Bây giờ chúng tôi đã có hợp đồng WTIndex của chúng tôi, hãy để Lôi tạo một khách sạn.

Hợp đồng khách sạn được tạo tự động bởi hợp đồng WTIndex khi gọi hàm registerHotel (). Chúng không được triển khai trực tiếp bởi người quản lý Khách sạn và chúng thuộc sở hữu của WTIndex.

> wt.registerHotel ('Khách sạn của tôi', 'Một khách sạn rất đẹp')

Chúng tôi có thể kiểm tra xem chúng tôi đã tạo khách sạn bằng cách gọi một số chức năng khác, ví dụ: chỉ lọc các khách sạn chúng tôi quản lý từ tài khoản ethereum hiện tại:

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

Hợp đồng khách sạn được tạo ra và chúng tôi có địa chỉ của nó. Hãy tạo ra một biến h với ví dụ để thuận tiện:

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

Hãy để kiểm tra xem chúng tôi có thể truy cập tên và mô tả:

> h.name ()
'Khách sạn của tôi'
> h.descrip ()
'Một khách sạn rất đẹp'

Thật tuyệt, chúng tôi có một khách sạn, nhưng khách sạn của chúng tôi hoàn toàn trống rỗng. Điều này giống như chỉ có đất mà không bắt đầu xây dựng. Bây giờ chúng ta cần tạo phòng và mô tả các phòng như thế nào.

Đối với điều này, chúng tôi sẽ tạo một Đơn vị và Đơn vị cho phòng của chúng tôi. Trái với những gì chúng tôi đã làm cho Khách sạn được tạo bởi hợp đồng WTIndex, chúng tôi cần tự triển khai các hợp đồng này và chúng tôi cần trao quyền sở hữu cho địa chỉ Khách sạn.

Hãy tạo ra một phòng cơ bản:

> UnitType.new (h.address, 'BASIC_ROOM'). Sau đó (i => ut = i)
> Đơn vị.new (h.address, 'BASIC_ROOM'). Sau đó (i => u = i)

Bây giờ để thêm Đơn vị và Đơn vị Loại trong Khách sạn của bạn, mẹo là hợp đồng Khách sạn không thuộc sở hữu của chúng tôi mà là hợp đồng WTIndex. Nếu chúng tôi cố gắng sửa đổi nó, chúng tôi sẽ bị từ chối:

> h.addUnitType (ut.address)
Lỗi: VM Ngoại lệ trong khi xử lý giao dịch: opcode không hợp lệ

Để thêm Đơn vị và Đơn vị, và nói chung cho tất cả các sửa đổi đối với hợp đồng Khách sạn, chúng tôi sẽ cần sử dụng hàm callHotel (). May mắn là điều này được bảo vệ để chỉ chúng tôi là người quản lý có thể gọi chức năng này:

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

Để chấp nhận đặt phòng, chủ khách sạn có hai lựa chọn:

  • Ngay lập tức với mã thông báo gốc Winding Tree LIF
  • Với một cơ chế xác nhận với các tùy chọn thanh toán khác.

Đối với hướng dẫn này, chúng tôi sẽ sử dụng cơ chế xác nhận, vì vậy, hãy để cấu hình cho nó:

> wt.callHotel (0, h.contract.changeConf Confirmation.getData (đúng))

Tất cả các thiết lập! Khách sạn của chúng tôi được tạo ra và chúng tôi sẵn sàng nhận đặt phòng từ khách hàng! Xin lưu ý rằng ở đây chúng tôi đã đơn giản hóa quá trình vì tự nhiên chúng tôi sẽ cần tùy chỉnh phòng với mô tả, tiện nghi, giá cả, tính sẵn có, hình ảnh, v.v.

Bây giờ chuyển đổi quan điểm, chúng tôi sẽ cho rằng chúng tôi là một Công ty du lịch (hoặc một khách du lịch rất am hiểu công nghệ!) Và chúng tôi sẽ đặt phòng khách sạn chúng tôi tạo ra.

Tìm kiếm Khách sạn đòi hỏi rất nhiều chỉ mục để tránh các mục trùng lặp và có thể tìm thấy giá khách sạn, tính khả dụng và tiện nghi phù hợp với mong đợi của khách du lịch. Thiết kế hiện tại khá đơn giản với một chỉ mục chứa tất cả các địa chỉ khách sạn nhưng chúng ta có thể giả định một cách an toàn các cơ chế lập chỉ mục tốt hơn sẽ có sẵn trong tương lai (ví dụ: một cây có quốc gia và thành phố). Việc tìm kiếm hoàn toàn miễn phí và nhanh chóng vì tất cả dữ liệu hàng tồn kho được phân cấp trong mỗi nút Ethereum và chỉ là quyền truy cập đọc. Nếu bạn nghĩ về điều đó, thì đó là một thỏa thuận tuyệt vời cho cả Cơ quan Du lịch và Khách sạn!

Đối với hướng dẫn này, chúng tôi sẽ cho rằng chúng tôi đã tìm thấy khách sạn và đơn vị chúng tôi muốn đặt (mà dễ dàng mà chúng tôi chỉ có một!).

Trong hệ sinh thái Winding Tree, khu bảo tồn được tạo thành hai phần:

  • Một nơi riêng tư với các chi tiết khách
  • Một nơi công cộng với các chi tiết của khách sạn được đặt và ngày.

Cái riêng chưa được chỉ định, nhưng ý tưởng là nó cấu trúc JSON. Một ví dụ về cấu trúc như vậy được lấy cảm hứng tự do từ kho lưu trữ mã Winding Tree có thể là:

Có một chi tiết kỹ thuật ở đây: có khả năng không phải tất cả các khách sạn sẽ yêu cầu cùng một dữ liệu và chấp nhận cùng một phương thức thanh toán, vậy làm thế nào để Cơ quan Du lịch có thể biết trường nào là bắt buộc hay không?

Quyết định của Khách sạn có chấp nhận hay không việc đặt phòng dựa trên dữ liệu riêng tư không liên quan đến hướng dẫn này, vì vậy, bây giờ, hãy đơn giản xem xét một chuỗi tùy ý.

Cơ chế để đặt dựa trên Sự kiện Ethereum cho phép các tương tác không đồng bộ trên blockchain. Đại lý du lịch có thể bắt đầu yêu cầu đặt phòng và điều này tạo ra một sự kiện:

> privateData = "PRIVATE_GUEST_DATA"
> công khaiData = h.contract.book.getData (u.address, web3.eth.coinbase, 20150, 5)
> h.beginCall (publicData, privateData) .then (i => startedCalltx = i)

Lưu ý: 20150 là số ngày sau ngày 1 tháng 1 năm 1970: ngày 3 tháng 3 năm 2025

Khách sạn có thể xem blockchain để đặt sự kiện. Khi một sự kiện được nhận, Khách sạn có thể truy xuất các chi tiết công khai và riêng tư:

> abiDecoder = Yêu cầu ('abi-decoder')
> abiDecoder.addABI (Khách sạn._json.abi)
> startedCallEvent = abiDecoder.decodeLogs (startedCalltx.receipt.logs) [0]
> startedCalltxCode = web3.eth.getTransaction (startedCalltx.tx) .input
> transferDecoding = abiDecoder.decodeMethod (startedCalltxCode)
> abiDecoder.decodeMethod (transferDecoding.params [0] .value)
{tên: 'cuốn sách',
  thông số:
   [{tên: 'đơn vị địa chỉ',
       giá trị: '0xf25186b5081ff5ce73482ad761db0eb0d25abfbf',
       gõ: 'địa chỉ'},
     {tên: 'từ',
       giá trị: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
       gõ: 'địa chỉ'},
     {name: 'fromDay', value: '20150', loại: 'uint256'},
     {name: 'daysAmount', value: '5', loại: 'uint256'}]}
> web3.toAscii (transferDecoding.params [1] .value)
'PRIVATE_GUEST_DATA'

Và chấp nhận đặt phòng:

> cấp phátCallHash = startedCallEvent.events [1] .value
> wt.callHotel (0, h.contract.cContueCall.getData (cấp phátCallHash))

Mọi người sau đó có thể thấy rằng căn phòng này được đặt cho ngày hôm đó và theo địa chỉ nào, và nó không thể được đặt lại:

> u.getReservation (20150)
[Số lớn {s: 1, e: 0, c: [0]},
  Số lượng lớn {s: 1, e: 0, c: [0]},
  '0x627306090abab3a6e1400e9345bc60c78a8bef57']
> h.beginCall (công khai, riêng tư)
Lỗi: VM Ngoại lệ trong khi xử lý giao dịch: opcode không hợp lệ

Sự thành công!

Trong hướng dẫn này, chúng tôi đã thấy cách sử dụng Hợp đồng MVP của Winding Tree cho khách sạn và chúng tôi đã có thể cảm nhận được tiềm năng của nền tảng này.

Tuy nhiên, một số điểm vẫn đang mở và yêu cầu phát triển thêm từ nhóm Winding Tree và cộng đồng của nó:

  • Khả năng mở rộng: Chi phí hiện tại để thiết lập một khách sạn khá cao (tính phí gas) vì chúng tôi cần gửi nhiều giao dịch để tạo từng loại đơn vị và đơn vị và định cấu hình chúng. Cập nhật thường xuyên cho hàng tồn kho cũng được yêu cầu khi một số công việc đang được thực hiện trong một phòng nhất định. Một tệp mô tả được lưu trữ ngoài hợp đồng, ví dụ như trong IPFS hoặc SWARM sẽ tốt hơn nhiều. Ngoài ra, một số diễn biến chung của Ethereum với việc chuyển sang Proof-of-Stake và State Channel sẽ cải thiện đáng kể tình hình.
  • Quyền riêng tư: Với cơ chế hiện tại, nó tương đối tầm thường với Hợp đồng khách sạn ABI để lấy dữ liệu riêng tư của khách. Chúng tôi đã tự nguyện đưa vào ví dụ một thẻ tín dụng để đặt ra câu hỏi về Tuân thủ PCI-DSS. Ngoài ra còn có GDPR ở châu Âu. Dữ liệu này sẽ được bảo mật như thế nào? Ngoài ra một số Cơ quan Du lịch có mức giá riêng do kết quả đàm phán kinh doanh, dữ liệu này có nên được công khai không?
  • Danh sách trùng lặp và danh sách giả: Không có gì ngăn cản một diễn viên xấu tạo ra Chỉ mục giả, Khách sạn giả, v.v. Họ thậm chí có thể tạo ra rất nhiều đặt phòng giả để làm cho nó có vẻ hợp pháp. Làm thế nào là công ty du lịch và cuối cùng là du khách được bảo vệ khỏi tình huống này? Nó không thể chấp nhận được khi có một khách du lịch đến một khách sạn để tìm thấy không có gì ở đây, hoặc tồi tệ nhất. Bất kỳ thực hiện nghiêm túc nào cũng cần phải đưa ra rất nhiều biện pháp để đảm bảo họ có địa chỉ hợp đồng tốt cho một khách sạn tồn tại trong thế giới thực.

Ý kiến ​​cá nhân của tôi là nền tảng tự nó hoạt động ngay cả khi có nhiều thách thức phía trước. Nền tảng này hoàn toàn có thể phá vỡ ngành Du lịch trong những năm tới, hãy chờ xem!