

Tiêu đề gốc: "Hàng khô | Hướng dẫn nhanh về phát triển ứng dụng mạng Lightning" của Michael Rhee
Nếu bạn muốn bắt đầu với lập trình Lightning Network và không quan tâm đến cái gọi là thực hành đúng và tốt nhất, thì bài viết này là dành cho bạn. Nói cách khác, hướng dẫn này mang tính chủ quan cao. Nếu bạn thích những văn bản có thẩm quyền theo phong cách O'Reilly, bài viết này có thể không phù hợp với sở thích của bạn. Tuy nhiên, nếu bạn muốn hiểu môi trường phát triển tối thiểu của Lightning Network và nội dung cơ bản của nó, thì nó đáng để đọc. Mục đích tôi viết bài này là trích xuất những điểm kiến thức cơ bản để tạo các ứng dụng mạng sét, để những người mới làm quen có thể nhanh chóng xây dựng và thử nghiệm.
Tôi tin rằng miễn là bạn nắm vững những điều cơ bản, bạn có thể viết các ứng dụng phức tạp và an toàn hơn. Tuy nhiên, mọi người đều phải bắt đầu từ đâu đó, và cảm giác cá nhân của tôi là mọi thứ đều khó khăn khi bắt đầu, và tôi nghĩ rằng việc tập hợp những suy nghĩ này lại với nhau có thể giúp một số chú cừu lạc lối nguôi ngoai nỗi đau.
Trước khi đi sâu vào chi tiết, cho phép tôi giới thiệu một chút thông tin cơ bản về bản thân:
Khoảng một tháng trước, tôi đã từ bỏ công việc ổn định là kiến trúc sư dữ liệu và bắt đầu nghiên cứu hệ sinh thái Bitcoin luôn thay đổi. Bạn sẽ thấy bài viết này cho thấy rằng bạn đã thực hiện bước đó (hoặc đang nghĩ về nó).
Nói một cách đơn giản, tôi nghĩ Bitcoin là sự đổi mới công nghệ thú vị nhất mà tôi từng thấy. Càng tìm hiểu về Bitcoin, tôi càng bị thu hút bởi nó. Công nghệ bitcoin hứa hẹn sẽ thay đổi và thậm chí định hình lại cách chúng ta tương tác ngày nay, khiến nó trở nên hoàn toàn mới. Tôi hy vọng sẽ đóng góp một phần của tôi.
Đó là lý do tại sao tôi chọn phát triển trên Bitcoin. Tôi hy vọng bài viết này sẽ mang lại lợi ích cho các nhà phát triển chưa quen với hệ sinh thái Lightning Network và tiềm năng của nó, đồng thời khuyến khích nhiều nhà phát triển đưa sự sáng tạo vào không gian Bitcoin.
Thành thật mà nói, có rất nhiều điều tôi muốn viết về hệ sinh thái Bitcoin (khái niệm về "tiền tệ được hỗ trợ bởi năng lượng" là số một), nhưng tôi sẽ phải đợi một ngày khác. Bây giờ chúng ta hãy bắt tay vào công việc:
Mô tả hình ảnh
-Nguồn: lnrouter.app-
Thiết kế cơ bản của Lightning Network là sử dụng các kênh để nhận ra các kết nối một-một giữa các nút. Để mở một kênh, bạn cần gửi một lượng Bitcoin nhất định và giao dịch này sẽ được ghi lại trên chuỗi khối Bitcoin. Sau đó, người dùng có thể sử dụng các hợp đồng ngoại tuyến đặc biệt để chuyển bitcoin trong các kênh giữa các nút mà không cần gửi giao dịch mới tới chuỗi khối.
Cách tiếp cận thực tế là theo dõi sự thay đổi số dư trong kênh theo thời gian thực. Ví dụ: nếu bạn gửi 100 satoshi vào kênh được mở với Alice, thì bạn có hạn mức chuyển khoảng 100 satoshi (đã trừ phí giao dịch trên chuỗi), có thể chuyển trực tiếp cho Alice hoặc gián tiếp thông qua Alice. Các lần chuyển tiền này gần như ngay lập tức vì chúng tôi chỉ cần điều chỉnh số dư của kênh với mỗi giao dịch. Điều chỉnh này đạt được bằng cách chuyển các tin nhắn được mã hóa giữa người gửi và người nhận.
Các ứng dụng Lightning chạy trên Lightning Network (cái gọi là Bitcoin lớp 2). Ứng dụng Lightning cũng sử dụng Bitcoin làm phương thức thanh toán, nhưng thanh toán nhanh hơn và phí giao dịch thấp hơn.
Mặc dù tôi chỉ đưa ra một cái nhìn tổng quan rất ngắn gọn về giao thức Lightning Network, nhưng nó cũng đủ để bắt đầu. Nếu bạn muốn hiểu chi tiết hơn về cách thức hoạt động của Lightning Network, đây là một số bài đọc hay. Cẩn thận đừng đắm chìm trong biển kiến thức, ngồi trước máy tính đọc khuya mà không gõ được một dòng code nào. Điều này không nhất thiết là xấu, nhưng mục đích của chúng ta vẫn là tu tập. Ngoài ra, việc đảm bảo giấc ngủ đầy đủ cũng rất quan trọng.
Tôi nghĩ rằng một cách tốt hơn để hiểu cách thức hoạt động của Lightning Network và các nút của nó là tự chạy một nút và tìm hiểu cách các khoản thanh toán được chuyển qua nút đó. Mặc dù phương pháp này đòi hỏi nhiều thời gian và tiền bạc hơn, nhưng nó vừa thú vị vừa mang lại nhiều kiến thức. 1
hoàn thành
Lightning Network là một giao thức mở. Điều này có nghĩa là Lightning Network có cách giao tiếp và diễn giải thông điệp tiêu chuẩn. Giống như HTTPS và TCP/IP không thuộc sở hữu của bất kỳ ai, giao thức Lightning Network cũng vậy. Bất kỳ ai cũng có thể tham gia Lightning Network miễn là họ tuân thủ các tiêu chuẩn. Không chỉ vậy, tiêu chuẩn sẽ tiếp tục phát triển khi các nhà phát triển tiếp tục củng cố giao thức và thêm các tính năng mới.
Bốn công ty hiện đang là trung tâm phát triển giao thức Lightning: Lightning Labs, Blockstream, ACINQ và Square Crypto, tất cả đều có triển khai riêng:
Lightning Labs — lnd (Go)
Blockstream — c-lighting (C)
ACINQ — eclair (Scala)
Square Crypto — Rust Lightning (Rust)
Tất cả các triển khai trên đều có thể giao tiếp qua Lightning Network. Sự khác biệt là API của các triển khai này. Bài viết này chỉ tập trung vào công ty của Lightning Labs, bởi vì đó là người đầu tiên tôi tiếp xúc và là người tôi biết nhiều nhất. Mặc dù cuối cùng tôi đã chọn Ind vì các yếu tố tình cờ, nhưng tôi phải tự hào rằng tài liệu Ind của Lightning Labs được viết rất tốt và các nhà phát triển có thể nhận được rất nhiều trợ giúp và hỗ trợ thông qua kênh Slack chính thức.
Lưu ý rằng cuộc thảo luận bên dưới sẽ xoay quanh Ind, nhưng các khái niệm cơ bản áp dụng cho tất cả các triển khai Lightning Network.
môi trường phát triển của bạn
Không nhảm nhí, chỉ cần sử dụng Polar.
Vâng, chỉ một vài từ nữa. Cho dù bạn là nhà phát triển hay người dùng, rào cản lớn nhất để xây dựng trên Lightning Network là cách tạo phần phụ trợ. Tôi không chỉ nói về một chiếc ví, bởi vì có rất nhiều giải pháp lưu ký đơn giản và nhanh chóng. Ý tôi là phần phụ trợ thực tế — các nút chạy Bitcoin và Lightning Network.
Tôi nói điều này vì ứng dụng của bạn cần có một số quyền nhất định trên nút để thực hiện một số việc quan trọng như tạo hóa đơn và theo dõi thanh toán qua lệnh gọi API/gRPC. Bạn cũng có thể làm điều này nếu một nhà điều hành nút đã cấp cho bạn quyền truy cập vào nút đó, nhưng tốt hơn là bạn nên tự chạy một nút.
Một nút có thể được sử dụng để phát triển mạng sét phải chạy hai quy trình: (1) máy khách bitcoin được đồng bộ hóa với khối mới nhất của chuỗi khối bitcoin; (2) máy khách mạng sét đã mở một kênh (có thể gửi và nhận thanh toán).
Nếu bạn đang sử dụng băng thông rộng thông thường tại nhà, sẽ mất ít nhất vài ngày để đồng bộ hóa chuỗi khối. Bạn có thể dùng thử Neutrino (một ví bitcoin nhẹ), nhưng tôi nghe nói rằng việc sử dụng nó để phát triển trên Lightning Network có thể gây ra một số vấn đề. Tôi đã không thử nó bản thân mình. Dù sao, nếu bạn chưa quen với những loại công cụ này, tôi nghĩ tốt nhất nên loại bỏ các biến số có thể có tác động tiêu cực. Vì vậy, nếu bạn có đủ khả năng, tôi khuyên bạn chỉ nên đồng bộ hóa toàn bộ chuỗi khối.
Nếu chúng ta sắp xếp các lớp Bitcoin, thì lớp Lightning Network là lớp thứ hai của Bitcoin. Như tôi đã đề cập ở trên, chúng ta cần mở các kênh trên Lightning Network để tiến hành giao dịch. Mặc dù việc mở một kênh trên Lightning Network không quá khó, nhưng bạn cần lập kế hoạch và phối hợp, cũng như thanh toán bằng bitcoin. Tất nhiên, bạn có thể đặt cược bitcoin để mở kênh và bắt đầu giao dịch. Tuy nhiên, bạn không phải chấp nhận rủi ro tài chính này. 2
Mô tả hình ảnh
-Nhìn! Nóng lòng muốn đồng bộ hóa! (Giao diện cực) -
Điều tuyệt vời về Polar là khi bạn đã sẵn sàng chuyển ứng dụng của mình sang mạng phụ trợ testnet hoặc mainnet, bạn chỉ cần cập nhật một vài cấu hình. Tôi đã có thể dễ dàng chuyển đổi giữa các phụ trợ cục bộ, testnet và mainnet bằng cách thêm hoặc nhận xét một vài dòng mã trong ứng dụng. (Tôi sẽ kết thúc với các tệp .env. Tất nhiên, các công cụ lược tả không phải là mục đích của bài viết này.)
Polar cũng hỗ trợ các nút lnd, c-lighting và eclair. Điều này có nghĩa là bạn có thể linh hoạt thử nghiệm với các triển khai khác.
Một lần nữa: chỉ cần sử dụng Polar. Đây là một cách nhanh chóng và dễ dàng để bắt đầu. Ngoài ra, nếu bạn không thích phát triển trên Lightning Network thì sao? Tìm ra điều này sớm sẽ tốt hơn là lãng phí quá nhiều thời gian và tiền bạc vào một hệ thống mà bạn không nhất thiết phải sử dụng. Phải nói rằng, nếu bạn thấy mình nghiện podcast của Stephan Livera, thứ mà bạn không thể ngừng nghe hàng đêm, thì bạn có thể thiết lập một môi trường phát triển nghiêm túc hơn.
chữ
Nhấp vào "Tạo mạng" để dễ dàng tạo môi trường Mạng Lightning mô phỏng trong Polar. Bạn có thể đặt tên cho mạng theo bất cứ thứ gì bạn muốn (cá nhân tôi nghĩ rằng "thử nghiệm" là một lựa chọn thông minh) và thêm hai nút lnd và một nút Bitcoin Core. Trên thực tế, đối với những người mới bắt đầu, đây chỉ là cấu hình tối thiểu và có thể thêm nhiều nút hơn sau này. Khi bạn đã tạo mạng của mình, bạn có thể khởi động nó. Có thể mất nhiều thời gian hơn một chút để bắt đầu mạng lần đầu tiên vì bạn phải tải xuống tất cả các hình ảnh Docker. Nhân tiện, bạn cần chạy Docker trên thiết bị của riêng mình. Như tôi đã nói trước đây, bạn vẫn phải tự mình tìm ra nó ở đây.
Cuối cùng, bạn sẽ thấy giao diện Polar tương tự như bên dưới:
Trong giao diện hiển thị trong hình trên, chúng ta có thể thấy các nút Ind của Alice và Bob và cả hai nút đều được kết nối với quy trình phụ trợ Bitcoin Core. Cũng lưu ý rằng chiều cao khối tại thời điểm này là 1. Đây là khối genesis của chúng tôi! Không giống như các chuỗi khối trực tiếp, Polar chỉ tạo ra các khối khi các giao dịch được gửi trong quá trình phát triển và thử nghiệm.
Bước tiếp theo là tạo một kênh giữa Alice và Bob để thanh toán chớp nhoáng. Nhấp vào nút của Alice, bảng điều khiển bên phải hiển thị các cách khác nhau mà chúng ta có thể tương tác với nút đó. Nhấp vào Hành động, chúng tôi thấy mọi thứ chúng tôi cần để cấp tiền cho ví của Alice bằng bitcoin mô phỏng và mở một kênh giữa Alice và Bob. Tiếp theo, hãy nạp một số tiền vào ví của Alice, sau đó mở kênh giữa Alice và Bob.
Nhấp vào "Gửi tiền" và sau đó gửi 1 triệu satoshi vào ví của Alice.
Nếu mọi thứ diễn ra theo đúng kế hoạch, bạn sẽ thấy chiều cao khối và số dư ví của Alice thay đổi. Nếu không, xin vui lòng yêu cầu giúp đỡ. Đây không phải là lỗi của bạn. 3
Bây giờ chúng ta có thể mở một kênh giữa Alice và Bob. Bây giờ Alice đã có tiền, chúng ta có thể để cô ấy mở một kênh "Đi" với Bob. Cái gọi là kênh chuyển có nghĩa là Alice có thể chuyển một lượng bitcoin nhất định cho Bob thông qua kênh này. Nhiều giao dịch chuyển tiền có thể được thực hiện giữa Alice và Bob, miễn là có số dư trong kênh. Tuy nhiên, xin lưu ý rằng khi kênh được mở lần đầu tiên, chỉ Alice mới có thể chuyển tiền cho Bob vì số dư hiện có thuộc về cô ấy. Tất nhiên sau khi Alice chuyển tiền cho Bob thì Bob mới có thể chuyển tiền cho Alice.
Phương pháp quản lý quỹ này trong kênh là để đảm bảo rằng cả hai bên đều có khả năng giao dịch, đó là cái mà chúng tôi gọi là tính thanh khoản của Lightning Network. Trên thực tế, người dùng chỉ có thể sử dụng số dư trong kênh. Đi sâu hơn một chút, thanh toán chỉ có thể thành công nếu có đủ số dư trong kênh giữa người gửi và người nhận thanh toán (và tiền đang chảy đúng hướng). Nếu không thanh toán sẽ thất bại. Cách quản lý tính thanh khoản hạn chế trong Lightning Network và cách tìm giải pháp thay thế là một chủ đề đáng để khám phá.
Thành thật mà nói, tôi đã gặp một số vấn đề khi mở kênh bằng Polar. Tôi nghi ngờ đó là sự khác biệt về trạng thái giữa giao diện người dùng và chương trình phụ trợ, nhưng tôi không chắc. Đôi khi, tắt và khởi động lại một nút (hoặc toàn bộ mạng) sẽ hữu ích. Thoát hoàn toàn và khởi động lại Polar cũng sẽ hoạt động. Ngoài ra, khi bạn ở trong tình huống như thế này, ra ngoài 10 phút có thể là một cách tuyệt vời để thư giãn đầu óc và tinh thần.
Dù lý do là gì, tôi thấy rằng cách tốt nhất để thực hiện các hoạt động của nút này là thông qua CLI do Polar cung cấp. Mặc dù giao diện người dùng không nhất thiết phải hiển thị thay đổi, nhưng chúng tôi có thể truy vấn trực tiếp cơ sở dữ liệu (có thể nói là 4) để xác định xem giao diện người dùng có phản ánh trung thực thay đổi hay không. Polar làm cho nó dễ dàng. Hãy làm điều đó ngay bây giờ.
Trước tiên, hãy chọn nút Ind của Alice, vào giao diện “Hành động”, nhấp vào “Khởi chạy” bên dưới “Terminal”, sau đó một dấu nhắc lệnh sẽ xuất hiện, như minh họa trong hình sau:
Bây giờ chúng ta có thể sử dụng công cụ lncli của nút Ind để mở kênh, tạo hóa đơn và thanh toán. Đầu tiên, hãy chạy lệnh sau để có cái nhìn tổng quan:
lncli --help
Chúng ta có thể chạy lệnh sau để mở một kênh có số dư 100.000 satoshi giữa Alice và Bob:
lncli openchannel --node_key
Bạn sẽ thấy phản hồi với "funding_txid", tương ứng với giao dịch cấp vốn mà Alice và Bob đã phát tới chuỗi khối Bitcoin mô phỏng của chúng tôi. Chạy lệnh sau để xem kênh mới được tạo của chúng tôi:
lncli listchannels
Nếu lệnh trả về một danh sách trống, hãy thử khai thác một vài khối bằng nút Bitcoin (trong màn hình “Hành động”). Làm như vậy sẽ giúp xác nhận giao dịch và mở kênh.
Bây giờ, chúng ta có thể thấy qua phản hồi của listchannels rằng kênh giữa Alice và Bob đã được mở thành công và số dư kênh là khoảng 100.000 satoshi (đã trừ phí giao dịch). Ít hơn 100.000 satoshi là số dư khả dụng mà Alice có thể trả cho Bob thông qua Lightning Network.
quá trình thanh toán
Cho đến nay, quy trình thanh toán dễ dàng nhất (và tôi tin là phổ biến nhất) trên Lightning Network là thông qua hóa đơn. Hóa đơn về cơ bản là một tập hợp các hướng dẫn thanh toán với "số tiền" và "người nhận thanh toán". Có các tham số và biến thể khác giúp hướng dẫn thanh toán mở ra nhiều khả năng thú vị hơn (ví dụ: hóa đơn hodl và đề xuất BOLT12), nhưng bài viết này chỉ tập trung vào các mẫu cơ bản nhất.
Chuyển sang thiết lập Polar của chúng ta, trước tiên hãy tạo hóa đơn, nhưng lần này sử dụng nút của Bob. Vì vậy, chúng tôi sẽ kích hoạt thiết bị đầu cuối của Bob và chạy lệnh sau:
lncli addinvoice --amt 100
Lệnh trên tạo một hóa đơn trị giá 100 satoshi (Thực ra, tôi đã gặp lỗi kết nối khi làm theo các bước này. Nếu bạn gặp vấn đề tương tự, hãy dừng và khởi động lại nút của Bob). Ta có thể xem thông tin của hóa đơn này thông qua phản hồi trả về:
{ "r_hash": "7d91cafaba85b6086924142dfd890f350eb53b17b80e2993d0a2ce5ccc7252f1", "payment_request": "lnbcrt1u1ps3lu04pp50kgu4746skmqs6fyzsklmzg0x58t2wchhq8zny7s5t89enrj2tcsdqqcqzpgsp55rtlzlf5rt0z5zg34nc2rlcm9mw6nd77x45r85z6zp07qumphr7q9qyyssqzrvxdlsluaeu7esscvv8skcmaly4794j7pg9ytapmn50uukezf4xpqma9758s39wpn4pwk475dztezg4tff8xpylksl4mww57q8hj7cq7s7222", "add_index": "1", "payment_addr": "a0d7f17d341ade2a0911acf0a1ff1b2edda9b7de356833d05a105fe07361b8fc"}
Hiện tại, chúng tôi chỉ tập trung vào phần "yêu cầu_thanh toán", vì phần dữ liệu này chứa mọi thứ mà Alice cần để thực hiện thanh toán cho Bob, cụ thể là số tiền thanh toán và địa chỉ của người nhận thanh toán5.
Nếu chúng tôi quay lại thiết bị đầu cuối nút của Alice, chúng tôi có thể nhận yêu cầu thanh toán và chuyển nó làm đối số cho lệnh sau:
- lncli sendpayment --pay_req
Kết quả là:
thành công.
chữ
Tại thời điểm này, bạn đã có đủ kiến thức và công cụ cơ bản để bắt đầu xây dựng ứng dụng. Sơ đồ trên phác thảo một ứng dụng ví dụ đơn giản sử dụng cùng lệnh gọi API mà chúng tôi sử dụng trong Polar để tạo và thanh toán hóa đơn. Đó là tất cả những gì bạn cần để xây dựng một kiến trúc ứng dụng cơ bản. Tất nhiên, đây chỉ là một ví dụ, chúng ta sẽ gặp nhiều vấn đề khác trong quá trình phát triển (mới chỉ là bước đầu), nhưng bạn sẽ dần tìm ra mình cần gì và giải quyết chúng như thế nào.
Một số gợi ý và tham khảo thêm:
Có nhiều thư viện có thể giúp các nhà phát triển viết ít mã soạn sẵn hơn và đi thẳng vào vấn đề. Cá nhân tôi, việc học cách sử dụng các thư viện này mang lại cho tôi nhiều thất vọng hơn là năng suất. Vấn đề chủ yếu là với tôi. Trừu tượng hóa là tuyệt vời, nhưng chỉ khi bạn có hiểu biết cơ bản về những gì đang được trừu tượng hóa. Tôi đã không nhận ra điều này khi tôi bắt đầu. Tôi thấy tài liệu API của Ind là dễ học nhất. Khi tôi làm theo hướng dẫn này để viết ứng dụng khách gRPC bằng Javascript, tôi đã đi đúng hướng.
Nếu bạn muốn xem ví dụ ứng dụng cụ thể hơn, hãy xem hướng dẫn trong Hướng dẫn dành cho người xây dựng Lightning Labs. Nếu bạn đã quen thuộc với các công cụ express, mobx và React được sử dụng trong hướng dẫn, thì tôi thực sự khuyên bạn nên thực hiện hướng dẫn này. Nếu bạn không quen thuộc với những công cụ này, có thể bạn sẽ không nhận được nhiều từ hướng dẫn này, nhưng bạn vẫn có thể học được điều gì đó. Một trong những điều tôi thích ở hướng dẫn này là nó cho thấy một số điều thú vị mà bạn có thể làm với các ứng dụng được xây dựng bằng Lightning Network (và bằng chứng mật mã).
Cuối cùng, nếu bạn nghĩ rằng bất cứ điều gì trong bài viết này là không rõ ràng hoặc không chính xác, xin vui lòng gửi cho tôi thông tin phản hồi hoặc câu hỏi.
Cảm ơn vì đã đọc.
Thôi nào.
chú thích cuối trang
Nếu bạn muốn chạy node, Umbrel rất phù hợp cho người mới bắt đầu. Tôi nghe nói MyNode, RaspiBolt và RaspiBlitz cũng tốt. Nếu bạn thích mày mò với các hệ thống phần mềm (hoặc SimCity) thì việc chạy các nút tệ nhất là một trò tiêu khiển thú vị, tốt nhất là một trò chơi tối ưu hóa tốn kém và vô tận (yêu cầu tiền thật, loại bạc).
Bạn cũng có thể chạy thử nghiệm trên mạng thử nghiệm và kiếm một số bitcoin thử nghiệm thông qua vòi bitcoin. Những đồng tiền này là vô giá trị, nhưng trở thành một kẻ keo kiệt có thể rất vui. Nếu bạn không quan tâm đến việc tự mình định cấu hình và quản lý các nút, bạn có thể sử dụng dịch vụ như Voltage. Voltage là dịch vụ đám mây trả tiền khi sử dụng hỗ trợ các nút testnet và mainnet.
Chà, chúng tôi không thể chắc chắn 100%. Để thận trọng, hãy xem kênh dành cho nhà phát triển trên lnd Slack. Tôi đã gặp nhiều nhà phát triển ở đây, họ xây dựng và duy trì các công cụ này. Bạn có thể nhìn thấy tôi! Ai đó có thể đã trải qua vấn đề mà bạn đang gặp phải. Nếu không, thật tuyệt - mọi người đều có thể học hỏi từ câu hỏi của bạn.
Chuỗi khối là một cơ sở dữ liệu công cộng và mọi người đều có quyền truy cập root. Để biết thêm thông tin, hãy xem: https://balajis.com/yes-you-may-need-a-blockchain/
Để biết giải thích chi tiết về các trường khác trong hóa đơn, bạn có thể xem bản tóm tắt này. Để tìm hiểu thêm về hợp đồng cơ sở, vui lòng đọc bài viết này.
