Trang chủ Tin Tức Cách thêm một blockchain mới vào Gravity

Cách thêm một blockchain mới vào Gravity

Bài viết này là một phần của tài liệu Gravity liên quan đến các khía cạnh kỹ thuật của giao thc và mạng. Nó cung cấp một cái nhìn tổng quan toàn diện, da trên ví dụ minh họa nhng gì một nhà phát triển có thể gặp phải khi tích hp một blockchain mi vào mạng crosschain Gravity, s dụng tích hp Ethereum & BSC làm ví dụ.

Phần mở rộng

Để mở rộng Gravity Protocol bằng cách thêm hỗ trợ cho một blockchain mới, một chuỗi các cam kết dự kiến sẽ vào Gravity-Tech/gravity-core và một số kho Github khác được đề cập trong suốt bài viết này. Các sửa đổi nguồn này có thể được chia thành bốn phần:

  1. Gravity Ledger Node logic (adaptor)
  2. Gravity Oracle logic
  3. Gravity Core contracts (Gravity-Tech/gravity-core/contracts)
  4. Gravity Deployer (Gravity-Tech/gateway-deployer)

Gravity thực sự khuyên bạn nên mở các yêu cầu pull trong các kho lưu trữ cụ thể được đề cập trong hướng dẫn trong khi triển khai giải pháp của bạn, điều này sẽ giảm thiểu việc viết lại codebase hiện có. Nếu mục đích của bạn là hỗ trợ logic lớp ứng dụng trên đầu chuỗi tích hợp mới, một số thay đổi cần được giới thiệu cho Gravity-Tech/gateway. Phần logic đó cũng bao gồm việc viết USER-SC (hợp đồng thông minh của người dùng) thích hợp.

Sản phẩm alpha đầu tiên được xây dựng trên Gravity là SuSy, một giao thức và giao diện cho các cổng xuyên chuỗi. Nó hiện kết nối Waves như là nguồn gốc và Binance Smart Chain là chuỗi đích. SuSy mainnet alpha đang có tại susy.gravity.tech và cung cấp giao diện frontend cho phép người dùng swap token USDN từ Waves thành BSC. USDN trên BSC kết hợp một chức năng tương tự như trên Ethereum, bao gồm tự động stake, elastic supply và phần thưởng stake được phân phối tự động giữa tất cả các holder.

SuSy Protocol

SuSy protocol dựa trên sự tin tưởng vào oracle, một trung gian trong việc chuyển thông tin từ blockchain này sang blockchain khác. Từ quan điểm kỹ thuật, khi triển khai oracle như một hệ thống phi tập trung đáng tin cậy, đó là những gì Gravity protocol làm, các cổng cross-chain trên nó thừa hưởng sự tin cậy. Một tính năng khác của việc triển khai SuSy protocol trên giao thức Gravity oracle là sự hiện diện của các dịch vụ trừu tượng cấp cao hữu ích.

Hơn nữa, để tiến hành cross-chain swap token từ blockchain này sang blockchain khác, không cần token bổ sung nào, ngoại trừ các token gốc của các mạng blockchain tương ứng.

Dưới đây là mô tả của thuật toán chuyển SuSy cross-chain. Nó cho thấy việc chuyển một token từ ORIGIN-CHAIN ​​đến DESTINATION-CHAIN, nơi nó sẽ được phát hành dưới dạng token swT (wrapped) và được gửi đến người nhận R trong DESTINATION-CHAIN.

Sơ đồ chuyển giao cross-chain điểm đến-điểm gốc của SuSy

Người dùng (S) tương tác với hợp đồng thông minh LU-PORT bằng cách chuyển một lượng (A) token T cho nó và chỉ định địa chỉ công khai của người nhận trong DESTINATION-CHAIN. Gateway hợp đồng thông minh tự động tạo một SWAP-ID duy nhất và đặt trạng thái đã đăng ký. Số tiền nhận được bị chặn trên hợp đồng thông minh LU-PORT.

Thông tin về sự kiện này được xử lý bởi các trình trích xuất, các dịch vụ của mạng Gravity xử lý dữ liệu nhận được và truyền nó tới Gravity. Từ Gravity framework, oracle di chuyển dữ liệu về SWAP-ID mới và swap hướng sang hợp đồng xác minh (NEBULA-SC), trong đó chữ ký của trình xác thực Gravity network và tính hợp pháp của ngữ cảnh đã chuyển được xác minh.

Sau khi xác minh, giao dịch SEND-DATA-TX được gọi, chứa một bộ dữ liệu và hướng dẫn để phát hành và gửi token swT cho người nhận (R).

Tương tự như vậy, tất cả dữ liệu về sự kiện này được xử lý bởi các chuyên gia Gravity network oracles, tùy thuộc vào việc thực thi thành công, trạng thái “processed” được đặt. Sau khi đạt đến một số khối nhất định mà ở đó khả năng fork là tối thiểu, có thể cần thiết lập trạng thái cuối cùng.

Ở chiều ngược lại, để chuyển token swT từ DESTINATION CHAIN sang ORIGIN CHAIN và mở khóa T trên hợp đồng LU PORT, quy trình cũng tương tự. Sự khác biệt duy nhất là trong các giao dịch cuối cùng, tức là việc đốt token swT trên IB PORT và mở khóa token T trên LU PORT được đảo ngược.

Liên quan đến việc mở rộng SuSy dApp trên các blockchain khác, USER-SC đóng vai trò của các cổng IB (Issue-Burn) và LU (Lock-Unlock). Các phương thức USER-SC có nghĩa là được gọi bởi NEBULA-SC. Vì vậy, để có một ứng dụng hoạt động trên giao thức, người ta cần:

  1. Cung cấp NEBULA-SC & SYSTEM-SC mới (Gravity contract) bên trong Gravity-Tech/Gravity -core/contract.
  2. Tạo USER-SC tùy chỉnh, phù hợp với NEBULA-SC tùy chỉnh của bạn.

Khuyến nghị về việc mở rộng Gravity Core

Để đảm bảo khả năng tương thích với một chuỗi mới, cần có một bộ hợp đồng thông minh riêng biệt. Quan trọng hơn, có hai loại hợp đồng: hợp đồng được sử dụng bởi cốt lõi của Gravity và hợp đồng dành riêng cho ứng dụng (ví dụ: SuSy).

Có thể tìm thấy các ví dụ về Cổng IB và Cổng LU cho Ethereum và Waves tại đây:

Hai hợp đồng thông minh mới sẽ được triển khai trong mạng blockchain mới với chức năng sau:

  1. Hợp đồng thông minh phải hỗ trợ lệnh gọi bên ngoài của hàm AttachEventDatavới các tham số sau: ID token (tùy chọn, vì các token khác nhau sẽ có cổng riêng), Số tiền, Người nhận.
  2. Chỉ một trong 5 tài khoản quản trị mới có thể gọi phương thức này.
  3. Sau tệp tin đính kèm, người nhận phải nhận được các token được wrap.
  4. Người sở hữu token được wrap sẽ có thể gửi token đến địa chỉ cổng, địa chỉ này sẽ kích hoạt lệnh gọi API (RPC).

Đối với tất cả các câu lệnh 1–4, một API mở và công khai phải được triển khai.

Sau khi tạo các hợp đồng, chúng cần được biên dịch thành bytecode. Các tệp bytecode đã biên dịch nên được đưa vào thư mục “/abi”. Cân nhắc kiểm tra thư mục “contract” bên trong kho lưu trữ Gravity-Tech/gateway để xem các ví dụ về mã nguồn của các gateway contract.

Để thêm một triển khai cho bất kỳ chuỗi mới nào, trước tiên nó phải được hỗ trợ bởi chính Gravity Network. Sau khi hoàn thành các hợp đồng thông minh, cần phải triển khai các bộ core adaptor trong kho lưu trữ gravity-core. Kiến trúc của ứng dụng Gravity Core là mô-đun, không có bất kỳ khớp nối chặt chẽ nào. Điều này đảm bảo dễ dàng mở rộng các thành phần riêng biệt. Về nguyên tắc, việc sử dụng bất kỳ ngôn ngữ lập trình hoặc thư viện nào đều có thể chấp nhận được, tuy nhiên, thông thường bạn nên mở rộng mã nguồn Go hiện có bằng cách cung cấp các triển khai cho các phương thức được yêu cầu hơn là viết lại từ đầu.

Để có ý tưởng rõ ràng hơn về những thay đổi bắt buộc đối với Gravity core, hãy xem “BSC support” pull request cho tiện ích mở rộng Gravity Ledger Node. Ở phần sau của bài viết này, Gravity sẽ minh họa từng phần của những thay đổi được mô tả trong yêu cầu pull ở trên.

Những điểm chính cần ghi nhớ:

  • Hãy thông báo về việc BlocksIntervaltham số cho chuỗi cụ thể (cần thiết cho một mạng đúng “pulsation”).
  • Bao gồm triển khai các bộ điều hợp, giao diện IBlockchainAdaptor, là phần mô tả rõ ràng nhất của từng chuỗi cụ thể.
  • Hãy thử bắt đầu một node và triển khai hợp đồng trong mạng tùy chỉnh để kiểm tra bộ điều hợp mới được viết của bạn. Sau khi thử nghiệm, hãy tạo một yêu cầu pull đến Gravity-Tech/gravity-core.

Tổng quan về những thay đổi bắt buộc dựa trên tích hợp BSC và Ethereum

cmd/gravity/commands/ledger.go

Trong hàm createApp(), một hàm tạo để khởi tạo bộ điều hợp mới nên được cung cấp:

Cân nhắc lưu trữ triển khai bộ điều hợp của bạn trong common/adaptors/[chain_name].go.

common/adaptors/[chain_name].go.

Một phần quan trọng liên quan đến giao tiếp với một chuỗi cụ thể là giao diện IBlockchainAdaptor:

Hãy xem lại cách bộ điều hợp Ethereum đáp ứng các yêu cầu của giao diện.

Đầu tiên, Gravity khai báo các loại blockchain cụ thể và một cấu trúc:

Việc triển khai Ethereum bao gồm:

  1. Vi hàm WithEthereumGravityContract()cho phép khởi tạo dựa trên GravityContractAddress. Nó được gọi trong hàm createApp mà chúng ta đã đề cập trước đó.
  2. Hàm EthAdapterWithGhClient() được sử dụng để khởi chạy Gravity Oracle:

Cũng cần triển khai một hàm khởi tạo, chẳng hạn như NewEthereumAdaptor() bên dưới:

Hãy cùng khám phá phương thức GetHeight() and Sign(). Cái đầu tiên truy xuất chiều cao blockchain và cái thứ hai thực hiện ký byte:

WaitTx phải chặn luồng. Một mẫu đơn giản cho la chọn cho phép xử lý các trường hợp cần chờ giao dịch. Hãy thận trọng: queryTicker được sử dụng ở đây để ngăn rò rỉ quy trình, vì vậy thời gian chờ 3 giây được mã hóa cứng:

PubKey() giải quyết khóa công khai của trình điều chỉnh. ValueType() khởi tạo Nebula-SC bằng ABI tương ứng. Tiếp theo, nó gọi DataType() để giải quyết kiểu giá trị mà Nebula hoạt động (Gravity hỗ trợ các kiểu ByteIntString).

Việc triển khai AddPulse() chứa nhiều chi tiết kỹ thuật. Điều quan trọng nhất mà phương pháp này thực hiện:

  1. Kiểm tra xem số xung Nebula và giá trị BFT có được duy trì ở trạng thái hợp đồng thông minh hay không. Nếu bất kỳ giá trị nào không tồn tại, phương thức trả về một chuỗi trống.
  2. Kiểm tra xem có đúng số trình xác thực (>= giá trị BFT) đã ký vào thư hay không.

Phương thức SendValueToSubs() chịu trách nhiệm gửi giá trị đến người đăng ký của Nebula. Nebula có quan hệ one-to-many với người đăng ký.

SetOraclesToNebula() cập nhật các oracle của Nebula. Việc ký và xác minh public key là bắt buộc:

SendConsulsToGravityContract() cũng tương tự, nhưng nó được sử dụng cho các consuls và trong ngữ cảnh của các Gravity contracts.

SignConsuls(), cũng như SignOracles(), chịu trách nhiệm ký các consuls/oracles được cập nhật. Cả hai phương pháp thực tế đều sử dụng cùng một thuật toán.

LastPulseId () giải quyết id xung cuối cùng của Nebula, là ID của hành động cuối cùng được thực hiện bởi Nebula oracles. Phương pháp này rất quan trọng đối với Gravity oracles, vì nó thường được sử dụng trong các trình vòng lặp so sánh các xung hiện tại và xung trước đó.

LastRound() xác định hành động mới nhất trong Gravity network. Về cơ bản, một vòng là một chỉ số cụ thể về chiều cao của blockchain, trong đó Gravity network đã thay đổi trạng thái thông qua cập nhật oracles/consuls, cập nhật điểm số hoặc gửi xung.

RoundExist() xác minh xem một vòng nhất định có tồn tại hay không.

common/account/chain.go

Trong tệp này, một hằng số phải được khởi tạo. Ở những nơi khác, nơi các hằng số hiện có được đề cập, hằng số mới này cũng nên được thêm vào:

common/account/nebula.go

Mô-đun này chịu trách nhiệm về logic Nebula.

common/account/pubkey.go

Ở đây, một hành vi chuỗi liên quan đến việc khởi tạo địa chỉ tài khoản được chỉ định.

common/storage/consuls.go

Mô-đun này chịu trách nhiệm phân tích các consul keys.

Thành phần Oracle

oracle/node/node.go

Một phần quan trọng của Gravity Oracle. node.go, cũng như toàn bộ mô-đun oracle/node, mô tả các triển khai hiện có và thiết lập các ràng buộc oracle.

đọc thêm

  1. https://github.com/Gravity-Tech/gateway
  2. https://github.com/Gravity-Tech/gravity-core
  3. https://github.com/Gravity-Tech/gateway-deployer
  4. Giao thức trọng lực WP
  5. SuSy White Paper – https://arxiv.org/pdf/2008.13515.pdf

Để biết thêm thông tin, bạn có thể đọc Gravity Whitepaper, truy cập trang web Gravity, tham gia cộng đồng trên Twitter hoặc Telegram hoặc liên hệ v[email protected]