Nguồn: Cộng đồng người Trung Quốc Starknet
Thông tin nhanh được chọn lọc
Thảo luận chuyên sâu về việc xây dựng hợp đồng cầu nối demo trên Bitcoin cho Starknet Đặt nền móng cho một cầu nối ở cấp độ sản xuất
Triển khai bốn hợp đồng thông minh gồm công cụ tổng hợp tiền gửi và rút tiền, công cụ mở rộng cầu nối và rút tiền
Tận dụng các hợp đồng đệ quy và cây Merkle để gửi và rút tiền theo nhóm một cách hiệu quả trong khi vẫn duy trì tính toàn vẹn và bảo mật của tài khoản người dùng
Giới thiệu
< /h2>
Trong bài viết này, chúng ta tìm hiểu sâu hơn về sCrypt Cách xây dựng hợp đồng cầu demo trên Bitcoin. Việc triển khai bằng chứng khái niệm này được thiết kế để đặt nền móng cho cầu nối cấp sản xuất cho mạng Starknet Lớp 2 (L2). Thiết kế của cầu nối cho phép hợp nhất nhiều giao dịch yêu cầu gửi hoặc rút tiền thành một giao dịch gốc duy nhất và được tích hợp vào hợp đồng cầu nối chính, cập nhật trạng thái của nó, bao gồm một tập hợp các tài khoản được tổ chức theo cây Merkle.
Vì tập lệnh hợp đồng cầu nối rất phức tạp nên tại sCrypt chúng tôi sử dụng ngôn ngữ dành riêng cho miền sCrypt (DSL) để viết phần triển khai.
Tổng quan
Cây cầu bao gồm một tập lệnh Bitcoin hợp đồng đệ quy. Ở đây, "hợp đồng" có nghĩa là tập lệnh khóa có thể áp đặt các điều kiện cho giao dịch chi tiêu, trong khi "đệ quy" có nghĩa là các quy tắc trên đủ mạnh để đạt được trạng thái và logic liên tục trên chuỗi (đây là yêu cầu cơ bản đối với bất kỳ giao dịch nào trên chuỗi). -chain hợp đồng thông minh).
Tập lệnh này tồn tại trong một chuỗi giao dịch, mỗi giao dịch áp đặt các ràng buộc lên cấu trúc của các giao dịch tiếp theo và các giao dịch tiếp theo sẽ mở khóa đầu ra của giao dịch hiện tại. Bất cứ khi nào một giao dịch mới được thêm vào chuỗi này, nó sẽ thể hiện một bản cập nhật cho trạng thái cầu nối. Do đó, phần cuối của chuỗi này giữ trạng thái cầu hiện tại.
Trạng thái hợp đồng—cụ thể là giá trị băm của nó—được lưu trữ trong một Non- đầu ra OP_RETURN tiêu hao. Mặc dù chúng tôi sẽ không sử dụng UTXO này nhưng dữ liệu của nó có thể được kiểm tra khi thực thi tập lệnh hợp đồng. Cụ thể, trạng thái giữ hàm băm gốc của cây Merkle chứa dữ liệu tài khoản, như hiển thị bên dưới:
p>
Cây Merkle lưu một tập hợp dữ liệu vị trí tài khoản cố định. Các nút lá chứa các giá trị băm của dữ liệu tài khoản tương ứng, bao gồm địa chỉ và số dư. Để thể hiện các vị trí tài khoản trống, các vị trí này được đánh dấu bằng 0 byte.
Mỗi lần cập nhật bridge sẽ khiến cây tài khoản thay đổi. Để tạo điều kiện thuận lợi cho quá trình cập nhật này, chúng tôi dựa vào bằng chứng Merkle, bằng chứng có khả năng xác minh rất hiệu quả trong tập lệnh Bitcoin. Bản cập nhật chủ yếu bao gồm hai bước. Đầu tiên, chúng tôi xác minh bằng chứng Merkle để cho thấy rằng cây Merkle chứa trạng thái hiện tại của một tài khoản cụ thể. Sau đó, sau khi tính toán trạng thái mới của tài khoản, chúng tôi sử dụng các nút phụ tương tự từ bằng chứng Merkle đã nói ở trên để lấy ra hàm băm gốc mới.
Bản cập nhật có thể là gửi tiền hoặc rút tiền. Cây cầu có thể thực hiện các hoạt động hàng loạt của các cập nhật này trong một giao dịch.
Gửi tiền
Mục tiêu của chúng tôi là cho phép người dùng gửi yêu cầu gửi hoặc rút tiền một cách độc lập. Để thực hiện việc này, người dùng tạo các giao dịch thanh toán vào hợp đồng tổng hợp tiền gửi hoặc rút tiền tương ứng. Hợp đồng tổng hợp các yêu cầu này vào cây Merkle. Hàm băm gốc của cây này có thể được hợp nhất vào hợp đồng cầu nối chính, sau đó xử lý mọi khoản tiền gửi hoặc rút tiền.
Trong các giao dịch tiền gửi, ngoại trừ Trong Ngoài việc băm dữ liệu tiền gửi và xây dựng cây Merkle, hợp đồng còn đảm bảo rằng số satoshi tiền gửi bị khóa trong đầu ra hợp đồng được tích lũy theo cách chính xác đến nút gốc của cây. Hợp đồng tổng hợp đảm bảo rằng chỉ hợp đồng thông minh trên chuỗi chính xác mới có thể sử dụng số tiền này. (Tất nhiên, trong môi trường sản xuất, chúng tôi cũng sẽ cho phép người dùng hủy giao dịch gửi tiền của họ).
Thiết kế cấu trúc cây này xuất phát từ những hạn chế trong việc xây dựng tập lệnh hợp đồng, không cho phép các giao dịch chứa quá nhiều đầu vào và đầu ra. Cấu trúc cây cho phép chúng tôi mở rộng quy mô theo thông lượng có thể tùy ý.
Yêu cầu rút tiền
Việc tổng hợp các yêu cầu rút tiền cũng tương tự như gửi tiền nhưng có một số khác biệt. Đầu tiên, chúng ta cần một phương thức xác thực để người dùng có thể rút tiền từ tài khoản của mình. Điều này khác với tiền gửi, nơi bất kỳ ai cũng có thể gửi tiền vào bất kỳ tài khoản nào, tương tự như cách sử dụng địa chỉ Bitcoin. Việc xác thực được thực hiện ở cấp độ nút lá của cây tổng hợp. Hợp đồng tổng hợp yêu cầu rút tiền kiểm tra xem địa chỉ rút tiền có khớp với địa chỉ P2WPKH đầu tiên được nhập trong giao dịch lá không.
Điều này đảm bảo rằng chủ sở hữu địa chỉ chấp thuận việc rút tiền vì họ đã ký vào yêu cầu giao dịch rút tiền. Một điểm khác biệt nhỏ so với tổng hợp tiền gửi là chúng tôi cũng băm số tiền tích lũy trung gian và chuyển chúng lên cấu trúc cây. Điều này là do chúng tôi cần dữ liệu này khi mở rộng quy mô rút tiền, sau này sẽ nói thêm về điều đó.
Những độc giả tinh ý có thể nhận thấy các vấn đề tiềm ẩn với mô hình xác thực này đối với các yêu cầu rút tiền. Điều gì sẽ xảy ra nếu một nhà điều hành quyết định gian lận và tạo một giao dịch ở gốc của cây tổng hợp có dữ liệu được giả mạo cục bộ thông qua các yêu cầu rút tiền giả không được xác thực? Chúng ta cần một cách hiệu quả để xác minh rằng giao dịch gốc xuất phát từ giao dịch lá hợp lệ.
Để giải quyết vấn đề này, chúng tôi thực hiện cái gọi là "kiểm tra nguồn gốc". Về cơ bản, chúng tôi có hợp đồng tổng hợp kiểm tra giao dịch trước đó và hai giao dịch trước đó, "giao dịch tổ tiên" của nó. Hợp đồng xác minh rằng các giao dịch này có chứa cùng một tập lệnh hợp đồng và thực hiện các bước kiểm tra giống nhau. Bằng cách này, chúng tôi thực hiện kiểm tra lịch sử giao dịch quy nạp. Vì hai giao dịch đầu tiên thực hiện các bước kiểm tra giống như hợp đồng hiện tại nên chúng tôi có thể xác nhận rằng "tổ tiên" của các giao dịch này cũng thực hiện các bước kiểm tra tương tự, cho đến tận nút lá (tức là giao dịch gốc).
Tất nhiên, chúng tôi đã thực hiện xác minh trên cả hai nhánh của cây. Do đó, tổng cộng tối đa sáu giao dịch được kiểm tra cho mỗi giao dịch nút tổng hợp.
Gia hạn rút tiền
Bây giờ chúng ta hãy chuyển sang phần cuối cùng của giải pháp: Gia hạn rút tiền. Sau khi xử lý một loạt yêu cầu rút tiền, hợp đồng cầu chính buộc đầu ra phải thanh toán tổng số tiền rút cho hợp đồng gia hạn. Chúng ta có thể coi hợp đồng này trái ngược với những gì hợp đồng tổng hợp yêu cầu rút tiền thực hiện. Nó bắt đầu từ nút gốc của cây rút tiền và mở rộng nó thành hai nhánh, mỗi nhánh chứa số tiền rút tương ứng phải trả cho nhánh đó. Quá trình này tiếp tục cho đến các nút lá của cây rút lui. Các giao dịch lá thực thi một đầu ra thanh toán đơn giản đến địa chỉ của chủ tài khoản đối với số tiền họ yêu cầu rút.
Phương pháp thực hiện
Để triển khai hợp đồng bắc cầu, chúng tôi đã phát triển bốn hợp đồng thông minh sCrypt, mỗi hợp đồng xử lý các khía cạnh khác nhau của hệ thống. Trong phần này, chúng tôi sẽ phác thảo ngắn gọn chức năng của từng hợp đồng.
Hợp đồng tổng hợp tiền gửi
Hợp đồng tổng hợp tiền gửi (DepositAggregator) tổng hợp các khoản tiền gửi riêng lẻ vào một cây Merkle, sau đó được tích hợp vào chứng thư cầu chính. Việc tổng hợp này cho phép xử lý tiền gửi hàng loạt, giảm số lượng giao dịch cần được xử lý riêng lẻ bởi cầu nối. Ngoài ra, nó cho phép người dùng gửi tiền gửi một cách độc lập, sau đó sẽ được các nhà khai thác xử lý.
Hàm xây dựng hợp đồng có hai tham số:
p>
toán tử: Khóa công khai của người điều hành cầu nối có thẩm quyền tổng hợp tiền gửi.
bridgeSPK: Khóa công khai tập lệnh (SPK) của hợp đồng cầu nối chính, đảm bảo rằng các khoản tiền gửi tổng hợp được hợp nhất một cách chính xác.
Chức năng cốt lõi của công cụ tổng hợp tiền gửi được gói gọn trong phương thức "tổng hợp". Phương pháp này thực hiện các bước sau:
Xác minh tiền ảnh Sighash và chữ ký của nhà điều hành: Đảm bảo rằng giao dịch được nhà điều hành cầu nối ủy quyền và tiền ảnh thở dài có định dạng chính xác và thuộc về đến giao dịch đang được thực hiện. Tìm hiểu thêm về xác minh tiền ảnh bằng tiếng thở dài trong bài viết này.
Xây dựng và xác thực ID giao dịch có tiền tố: Kiểm tra tổng hợp giao dịch trước đó là hợp lệ và được tham chiếu chính xác.
Tập hợp cây Merkle: Xác minh rằng dữ liệu tiền gửi được chuyển dưới dạng hàm băm chứng kiến khớp với Trạng thái được lưu trữ trong các trận đấu giao dịch trước đó.
Xác minh số tiền: Xác nhận rằng số tiền ở đầu ra phía trước khớp với số tiền gửi được chỉ định, đảm bảo Các quỹ được tính toán chính xác trong tổng hợp.
Cập nhật trạng thái: Tính toán hàm băm mới bằng cách ghép các hàm băm của các giao dịch trước đó và cập nhật trạng thái trong đầu ra OP_RETURN.
Ngăn chặn tấn công truy cập lại: Thực thi các tập lệnh và số lượng đầu ra nghiêm ngặt để ngăn chặn sửa đổi trái phép hoặc chi tiêu gấp đôi.
Một lần Tiền đặt cọc được tổng hợp và chúng phải được sáp nhập vào hợp đồng cầu chính. Quá trình này được xử lý bằng phương pháp "hoàn tất", các bước bao gồm:
Xác minh trước giao dịch: Tương tự như phương pháp "tổng hợp", xác minh các giao dịch trước giao dịch để đảm bảo tính toàn vẹn của dữ liệu được hợp nhất.
Tích hợp với hợp đồng cầu nối: Kiểm tra xem tiền gửi tổng hợp có được hợp nhất chính xác vào hợp đồng cầu nối chính hay không bằng cách tham chiếu ID giao dịch của cầu nối và khóa chung tập lệnh.
Mã nguồn hoàn chỉnh của hợp đồng tổng hợp tiền gửi có thể được xem trên GitHub.
Hợp đồng tổng hợp rút tiền
Hợp đồng tổng hợp rút tiền (WithdrawalAggregator) được thiết kế để tổng hợp các yêu cầu rút tiền riêng lẻ vào Merk Ershu, tương tự về cách tiền gửi được xử lý bởi các nhà tổng hợp tiền gửi. Tuy nhiên, hoạt động rút tiền yêu cầu xác thực bổ sung để đảm bảo rằng chỉ những chủ tài khoản hợp pháp mới có thể rút tiền từ tài khoản của họ.
Các chức năng cốt lõi của công cụ tổng hợp lệnh rút tiền được gói gọn trong Trong phương thức "tổng hợp", phương pháp này thực hiện các bước sau:
Xây dựng và xác thực ID giao dịch trước đó: Quá trình này xác minh rằng giao dịch tổng hợp trước đó là hợp lệ và được tham chiếu chính xác.
Bằng chứng xác minh quyền sở hữu: Việc xác minh các giao dịch Bằng chứng quyền sở hữu đảm bảo rằng chỉ chủ sở hữu hợp pháp mới có thể rút tiền từ tài khoản.
Kiểm tra nguồn gốc thông qua "giao dịch tổ tiên": Tương tự như công cụ tổng hợp tiền gửi, hợp đồng thực hiện kiểm tra quy nạp bằng cách xác thực các giao dịch tổ tiên. Điều này đảm bảo tính toàn vẹn của lịch sử giao dịch và ngăn chặn các nhà khai thác chèn các yêu cầu rút tiền trái phép.
Xác minh số tiền và tính toán tổng số tiền: Phương pháp này tính toán tổng số tiền cần rút bằng cách cộng số tiền của yêu cầu rút tiền hoặc tổng hợp trước đó. số lượng.
Cập nhật trạng thái: Tính toán hàm băm mới chứa tổng hàm băm của giao dịch trước đó và số tiền rút. Hàm băm này được lưu trữ trong đầu ra OP_RETURN để cập nhật trạng thái.
Ngăn chặn tấn công truy cập lại và thực thi đầu ra: Đảm bảo đầu ra được xác định nghiêm ngặt để ngăn chặn các cuộc tấn công truy cập lại hoặc sửa đổi trái phép.
Rút tiền Mã nguồn hoàn chỉnh của hợp đồng tổng hợp có thể được xem trên GitHub.
Hợp đồng Bridge
Hợp đồng Bridge là thành phần cốt lõi trong hệ thống của chúng tôi và là hợp đồng chính để duy trì trạng thái của cây cầu, bao gồm cả Merck Các tài khoản của tổ chức Ershu và số dư của họ. Nó xử lý các hoạt động gửi và rút tiền bằng cách tích hợp với hợp đồng tổng hợp mà chúng ta đã thảo luận trước đó.
Hàm xây dựng hợp đồng có hai tham số:
-
toán tử: Khóa chung của người vận hành cầu nối có quyền cập nhật trạng thái cầu nối.
expanderSPK: Khóa công khai tập lệnh (SPK) của hợp đồng WithdrawalExpander, được sử dụng trong quá trình rút tiền.
Phương thức gửi tiền có trách nhiệm xử lý các giao dịch gửi tiền tổng hợp và cập nhật số dư tài khoản tương ứng.
Các bước thực hiện phương thức gửi tiền bao gồm:
< /p >
Xử lý tiền gửi và cập nhật tài khoản:
Cập nhật trạng thái cầu nối và đầu ra:
Sau khi xử lý khoản tiền gửi, hãy tính toán Tài khoản mới gốc Merkel.
Tạo một giá trị băm trạng thái mới thể hiện trạng thái cầu nối được cập nhật.
Xây dựng sản lượng hợp đồng để cộng tổng số tiền đặt cọc vào số dư cầu.
Đảm bảo đầu ra có định dạng mong muốn để duy trì tính toàn vẹn của dữ liệu.
Phương thức rút tiền xử lý các giao dịch rút tiền tổng hợp, cập nhật số dư tài khoản và chuẩn bị số tiền được phân bổ thông qua công cụ mở rộng rút tiền.
Các bước thực hiện phương thức rút tiền bao gồm:
< /p >
Xử lý yêu cầu rút tiền và cập nhật tài khoản:
Cập nhật trạng thái bridge và đầu ra:
Sau khi xử lý việc rút tiền, tính toán Tài khoản mới Gốc Merkel.
Tạo một giá trị băm trạng thái mới thể hiện trạng thái cầu nối được cập nhật.
Xây dựng sản lượng hợp đồng để trừ tổng số tiền rút ra khỏi số dư cầu.
Tạo đầu ra mở rộng cho hợp đồng mở rộng rút tiền có chứa tổng số tiền rút.
Đảm bảo đầu ra có định dạng mong muốn để duy trì tính toàn vẹn của dữ liệu.
Mã nguồn hoàn chỉnh có thể được xem trên GitHub.
Hợp đồng mở rộng rút tiền
Công cụ mở rộng rút tiền (WithdrawalExpander) là thành phần cuối cùng trong hệ thống bắc cầu của chúng tôi và chịu trách nhiệm về số tiền rút tổng hợp dựa trên tài khoản của người dùng. yêu cầu rút tiền được phân phối lại cho người dùng cá nhân. Nó đảo ngược quá trình tổng hợp được thực hiện bởi công cụ tổng hợp rút tiền, mở rộng dữ liệu rút tiền tổng hợp trở lại các khoản thanh toán của người dùng cá nhân.
Bộ mở rộng rút tiền Cốt lõi chức năng được gói gọn trong phương thức "mở rộng". Phương pháp này chấp nhận dữ liệu rút tiền tổng hợp và mở rộng đệ quy thành các giao dịch rút tiền riêng lẻ, trả số tiền tương ứng cho người dùng.
Mở rộng sang nút lá: Nếu phương thức mở rộng sang nút lá (rút một lần), nó sẽ xác thực dữ liệu rút tiền và tạo đầu ra thanh toán trực tiếp đến địa chỉ của người dùng.
Mở rộng thêm: Nếu phương thức chưa đạt đến cấp độ nút lá, nó sẽ tiếp tục mở rộng, chia dữ liệu tổng hợp thành hai nhánh và tạo đầu ra để sử dụng bằng các giao dịch mở rộng hơn nữa.
< hình ảnh src="https://img.jinse.cn/7329092_image3.png" title="7329092" alt="6YQAiFGQtiyEC10AdhATWiFGa4duEw0TlGiNTTYc.jpeg">
Kết luận
h2>
Trong quá trình triển khai bằng chứng khái niệm này, chúng tôi sử dụng sCrypt Ngôn ngữ cụ thể của miền nhúng (DSL) đã phát triển hợp đồng cầu nối dựa trên Bitcoin được OP_CAT hỗ trợ. Cây cầu sử dụng các hợp đồng đệ quy và cây Merkle để gửi và rút tiền theo nhóm một cách hiệu quả trong khi vẫn duy trì tính toàn vẹn và bảo mật của tài khoản người dùng. Bằng cách thiết kế và triển khai DepositAggregator, WithdrawalAggregator, Bridge và Withdrawal Extender (WithdrawalExpander) Với bốn hợp đồng thông minh này, chúng tôi cung cấp một cách để quản lý các tương tác có trạng thái trên Bitcoin, tạo điều kiện cho khả năng tương tác với các mạng lớp thứ hai như Starknet. Công việc này cung cấp nền tảng kỹ thuật để xây dựng các cầu nối cấp sản xuất, có khả năng nâng cao khả năng mở rộng và chức năng trong hệ sinh thái Bitcoin.
Tất cả việc triển khai mã và kiểm thử toàn diện đều có sẵn trên GitHub.
[Toàn văn kết thúc]
Link gốc: https://starkware.co/ blog /implementing-a-bridge-covenant-on-op-cat-bitcoin/
Gương: https://mirror.xyz/starknet-zh.eth/zFbhQB7gfmSTV4CcTv5MRqJBUnKuwMLTNOgZ6jUgDK8