paint-brush
Hợp đồng thông minh đối đầu - Ethereum vs.by@johnjvester
957
957

Hợp đồng thông minh đối đầu - Ethereum vs.

John Vester8m2022/08/19
Read on Terminal Reader
Read this story w/o Javascript

Các nhà phát triển muốn viết hợp đồng thông minh có một số lựa chọn vững chắc, nhưng cái nào hiện tốt hơn ... và tại sao?

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coins Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Hợp đồng thông minh đối đầu - Ethereum vs.
John Vester HackerNoon profile picture


Kể từ khi công nghệ hợp đồng thông minh ra đời, Solidity đã là ngôn ngữ mã hóa được các nhà phát triển hợp đồng thông minh lựa chọn.


Tuy nhiên, nếu bạn là một nhà phát triển Solidity, bạn đã biết nó có những hạn chế. Trong số các sai sót khác, các mối quan tâm lớn về bảo mật có thể phát sinh do xử lý sai một số loại dữ liệu đơn giản và không có các kiểm soát truy cập tích hợp sẵn.


Một ngôn ngữ hợp đồng thông minh mới được phát triển cho chuỗi khối Flow, Cadence , học hỏi từ những giám sát của Solidity và tự giải quyết nhiều vấn đề cố hữu của nó. Và nếu bạn đã biết Solidity, thật đơn giản để học!


Bài viết này giới thiệu về ngôn ngữ hợp đồng thông minh Cadence, trình bày chi tiết cách nó cải thiện so với Solidity, sau đó đi qua so sánh song song của cả hai ngôn ngữ trên một số ví dụ về hợp đồng thông minh phổ biến. Cuối cùng, bạn sẽ cảm thấy thoải mái với Cadence và sẵn sàng bắt đầu với Flow!


Giới thiệu về Cadence

Cadence là ngôn ngữ lập trình hỗ trợ chuỗi khối Flow, được tạo ra ban đầu bởi Dapper Labs để hỗ trợ các trò chơi tiền điện tử quy mô lớn và các dự án NFT. (Bạn có thể đã nghe nói về NBA Top Shots — một trong những dự án thành công nhất của họ.) Cú pháp của nó có thể quen thuộc, vì nó được lấy cảm hứng từ các ngôn ngữ hiện đại phổ biến như Swift, Rust và Kotlin. Cadence là tĩnh lặng gõ mạnh , với cách tiếp cận theo định hướng tài nguyên và mô hình bảo mật dựa trên khả năng.


Tất cả điều này có nghĩa là Cadence được tối ưu hóa cao cho việc tạo và quản lý tài sản kỹ thuật số .


Cải tiến quan trọng nhất mà Cadence giới thiệu là mô hình dựa trên tài nguyên . Cách tiếp cận này giúp việc tạo, theo dõi và quản lý nội dung của người dùng dễ dàng hơn đáng kể. Thay vì dựa vào sổ cái công khai trung tâm làm nguồn chân lý (như Ethereum), các tài sản được gắn trực tiếp với tài khoản lưu trữ của người dùng. Vì vậy, một nội dung được tạo dưới dạng tài nguyên, chẳng hạn như NFT, chỉ có thể tồn tại ở một vị trí tại một thời điểm. Điều này đảm bảo rằng họ chỉ có một chủ sở hữu — tài khoản thuộc sở hữu bên ngoài hoặc hợp đồng thông minh.


Tài nguyên là Loại tuyến tính với hỗ trợ tạo và thời gian chạy có kiểm soát


Cadence cải thiện như thế nào so với độ vững chắc

Cadence được cải thiện hơn Solidity theo nhiều cách. Hãy xem ba ví dụ — những lỗi nhỏ về mã hóa, bảo mật và kiểm soát truy cập cũng như triển khai hợp đồng.

Những lỗi mã hóa nhỏ đó

Một số vấn đề lớn nhất với Solidity thường bắt nguồn từ những sai lầm nhỏ nhất. Ví dụ: khởi tạo một biến chỉ với một giá trị mặc định - mặc dù đôi khi thuận tiện - có thể dẫn đến kết quả không mong muốn nếu biến đó không được thay đổi. Và các kiểu dữ liệu phạm vi cố định có thể dẫn đến các tình huống tràn hoặc tràn dòng tiềm ẩn, điều này sẽ thật tai hại nếu kiểu dữ liệu đó đại diện cho một giá trị tiền tệ.


Trong Cadence, các giá trị biến phải được đặt khi khởi tạo, loại bỏ mọi kết quả không mong muốn khỏi các giá trị mặc định. Ngoài ra, các số nguyên trong Cadence được tự động kiểm tra các điều kiện thiếu hoặc tràn, trong khi bạn sẽ cần kế thừa thư viện toán học an toàn của OpenZeppelin hoặc sử dụng phiên bản cao hơn 0.8 với Solidity.

Bảo mật và kiểm soát truy cập

Khi nói đến bảo mật và kiểm soát truy cập, Solidity yêu cầu bạn tạo các công cụ sửa đổi tùy chỉnh hoặc kế thừa các hợp đồng thông minh dựa trên bảo mật khác, nhưng cũng có nhiều chức năng được công khai theo mặc định.


Với mô hình bảo mật dựa trên khả năng của Cadence, các tài khoản chỉ có thể thực hiện các chức năng mà họ có quyền truy cập. Điều này có nghĩa là Cadence có quyền kiểm soát truy cập về cơ bản được tích hợp sẵn trong chính ngôn ngữ. Ngoài ra, các phương thức được xác định trên các đối tượng tài nguyên trong Cadence không thể dễ bị tấn công bởi các cuộc tấn công gần đây, một điều mà các nhà phát triển Solidity phải nhận thức rõ ràng khi tạo luồng logic của họ.

Triển khai hợp đồng thông minh

Khi các vấn đề trong hợp đồng thông minh Solidity được tìm thấy, các nhà phát triển không thể khắc phục chúng nếu không triển khai một hợp đồng hoàn toàn mới. Và ngay cả khi đó, hợp đồng dễ bị tổn thương vẫn tồn tại. Các nhà phát triển phải đảm bảo cơ sở người dùng của họ chuyển sang hợp đồng mới.


Trong Cadence, khả năng nâng cấp hợp đồng thông minh được tích hợp sẵn và minh bạch. Khi mã được tuyên bố là an toàn và cuối cùng, hợp đồng có thể được biến thành bất biến bằng cách xóa các khóa khỏi chủ sở hữu của hợp đồng thông minh.


Nhìn chung, Cadence là một ngôn ngữ hợp đồng thông minh an toàn hơn và bảo mật hơn, ít có khả năng xảy ra lỗi hơn.


Bây giờ chúng ta hãy xem xét chi tiết sự khác biệt giữa các hợp đồng thông minh được viết bằng Solidity và Cadence. Chúng ta sẽ xem xét một hợp đồng Hello World đơn giản và sau đó là một triển khai NFT phức tạp hơn.

Hợp đồng đơn giản

Hãy bắt đầu với một tác phẩm kinh điển mọi thời đại. Tất cả chúng tôi đã viết “Hello World” bằng nhiều ngôn ngữ, vì vậy đây là phần giới thiệu dễ dàng về Cadence.


Chúng ta hãy đi qua nó từng bước.

Định nghĩa hợp đồng

Đầu tiên, chúng ta có định nghĩa về hợp đồng. Sự khác biệt rõ ràng là hợp đồng Cadence có một công cụ sửa đổi kiểm soát truy cập: trong trường hợp này là quán rượu. Công cụ sửa đổi này đảm bảo rằng mọi người trong mạng Dòng chảy đều có thể truy cập vào hợp đồng, hành vi mặc định cho các hợp đồng Solidity.


Tuy nhiên, trong Cadence, chúng tôi cũng có thể đặt kiểm soát truy cập để access(account) . Điều này giới hạn quyền truy cập của hợp đồng vào tài khoản đã triển khai hợp đồng đó . Ở đây chúng ta đã thấy sự khác biệt lớn giữa Flow và Ethereum. Chúng tôi không chỉ đơn giản triển khai các hợp đồng cho chuỗi khối Flow; chúng tôi triển khai chúng vào bộ nhớ tài khoản của mình. Trên chuỗi khối Flow, mỗi tài khoản được khởi tạo với bộ lưu trữ, nơi các tài nguyên và cấu trúc có thể được lưu trữ. Bộ nhớ này có các quyền riêng, cho phép chúng tôi kiểm soát chi tiết những người có thể thực hiện các phương pháp trong hợp đồng của chúng tôi.

Các biến hợp đồng

Dòng tiếp theo xác định một biến chuỗi trong phạm vi hợp đồng của chúng tôi. Dấu chấm phẩy là tùy chọn trong Cadence và từ khóa let được sử dụng để xác định biến.


Cadence có hai loại biến — có thể thay đổi và bất biến. Các biến được tạo với let là bất biến, hay còn được gọi là hằng số; chúng tôi chỉ có thể đặt chúng một lần và không thể thay đổi chúng trong suốt thời gian của hợp đồng. Chúng tôi xác định các biến có thể thay đổi (những biến có thể được thay đổi) bằng từ khóa var .


Trong trường hợp này, chúng tôi đặt giá trị biến trong phương thức init, vì Cadence đảm bảo rằng phương thức này chỉ được gọi một lần cho mỗi lần triển khai hợp đồng.

Phương pháp

Cadence tương đương với hàm constructor của Solidity là phương thức init . Phương thức này được gọi chính xác một lần - tại thời điểm triển khai hợp đồng.


Bên trong phương thức init, chúng tôi đặt giá trị cho biến lời chào của chúng tôi. Trong khi Solidity ghi vào các biến hợp đồng theo mặc định, Cadence ghi vào các biến cục bộ và yêu cầu bạn sử dụng đối tượng tự để truy cập các biến hợp đồng. Quyết định này bảo vệ khỏi việc bạn vô tình ghi vào biến hợp đồng khi mắc lỗi đánh máy.


Phương thức thứ hai của hợp đồng của chúng tôi trả về biến lời chào. Trong cả Cadence và Solidity, chúng ta phải khai báo quyền truy cập cho phương thức là công khai và cả hai ngôn ngữ đều yêu cầu chúng ta xác định kiểu trả về. Trong trường hợp này, đó là một chuỗi.


Nhưng Solidity yêu cầu chúng ta ở cấp độ thấp hơn ở đây. Nó yêu cầu chúng ta phải nói rõ ràng rằng chuỗi nằm ở đâu. Nó cũng giúp chúng tôi đánh dấu các chức năng dưới dạng chế độ xem, để chúng tôi không vô tình sửa đổi trạng thái của blockchain.


Mặt khác, Cadence không cần điều khiển cấp thấp đó, vì nó được gõ mạnh và tĩnh. Các lỗi tiềm ẩn được phát hiện trước khi chương trình được chạy trên chuỗi, làm cho toàn bộ khai báo phương thức dễ đọc hơn bằng cách loại bỏ các từ khóa thừa.

Hợp đồng NFT

Tiếp theo, hãy xem một hợp đồng NFT cơ bản từ cả hai ngôn ngữ:


Vì cả hai ngôn ngữ đều có các cách tiếp cận khác nhau đối với ví dụ này, chúng ta hãy xem xét chúng một cách riêng biệt: trước tiên hãy xem qua ví dụ Solidity, sau đó là Cadence.

Sự vững chắc

Trong Solidity, NFT về cơ bản là một danh sách các ID. Bạn phải theo dõi các ID này bên trong hợp đồng thông minh và tăng chúng theo cách thủ công để đảm bảo tính duy nhất. Solidity không biết bất cứ điều gì về NFT hoặc tính độc đáo của chúng. Đó chỉ là danh sách các ID được ánh xạ tới chủ sở hữu của chúng, tất cả đều được quản lý thủ công trong hợp đồng. Điều này để lại chỗ xảy ra lỗi nếu quá trình tăng ID được xử lý không đúng cách, có khả năng dẫn đến nhiều NFT có ID giống hệt nhau.


Trong ví dụ, NFT không có bất kỳ dữ liệu bổ sung nào được đính kèm, nhưng bạn có thể thêm một ID ánh xạ khác vào một URI. Hợp đồng đảm bảo mọi NFT mới được đúc đều được ánh xạ tới địa chỉ của chủ sở hữu.


Đây là một ví dụ đơn giản, tất nhiên. Thông thường, bạn sẽ cần mở rộng một số giao diện để có được hợp đồng NFT bảo mật từ xa và các tính năng như siêu dữ liệu được sử dụng để đính kèm các JPG nổi tiếng vào NFT của bạn, nhưng các cơ chế cơ bản đều giống nhau.

Cadence

Bây giờ, chúng ta hãy xem xét phiên bản Cadence và cách nó cải thiện dựa trên ví dụ Solidity này.

Định nghĩa tài nguyên

Ví dụ về Cadence bắt đầu với một loại tài nguyên được gọi là NFT . Chú ý biểu tượng @ ở phía trước NFT ? Biểu tượng này là bắt buộc, vì nó đảm bảo việc sử dụng và hành vi của các loại tài nguyên sẽ vẫn rõ ràng.


Chúng ta có thể tạo các phiên bản từ một tài nguyên và nó có thể có các thuộc tính giống như một cấu trúc. Sự khác biệt so với cấu trúc thông thường là tài nguyên là một loại đặc biệt xử lý quyền sở hữu ngoài dữ liệu mà nó lưu trữ.


Bên trong kiểu tài nguyên NFT , có một trường id. Trường id là một số nguyên, UInt64 và nó là một id duy nhất được cấp cho mỗi tài nguyên NFT. id này sẽ khác nhau đối với mỗi tài nguyên NFT, có nghĩa là tài nguyên không thể bị trùng lặp hoặc kết hợp. Tiếp theo, trường id được khởi tạo bằng hàm init .


Tương tự như cách trình kiểm tra mượn của Rust đảm bảo chỉ một hàm có thể sửa đổi một biến, Cadence đảm bảo điều tương tự cho các tài nguyên của nó.

Tạo tài nguyên

Khi chúng tôi tạo một tài nguyên mới, chúng tôi phải di chuyển nó xung quanh các vị trí lưu trữ. Hợp đồng thông minh của chúng tôi sẽ không chạy đúng cách nếu chúng tôi để nguyên tài nguyên, vì vậy điều này buộc chúng tôi phải cân nhắc với các tài nguyên và vị trí lưu trữ của chúng. Hình thức kiểm soát này cũng đảm bảo rằng tài nguyên không bao giờ bị mất hoặc vô tình bị xóa; họ chỉ có thể ở một địa điểm tại một thời điểm.


Khi chúng ta gọi hàm mint, nó sẽ tạo một phiên bản mới của tài nguyên NFT của chúng ta. Hàm này trả về một tài nguyên có kiểu NFT và nhận vào trường, id , từ tài nguyên đã được xác định trước đó. Từ khóa create hơi giống toán tử new trong lập trình hướng đối tượng, tạo ra một tài nguyên mới. <- hoặc move-operator, nói rõ rằng tài nguyên này không có sẵn tại nguồn sau khi chúng tôi gọi nó.

Lưu trữ tài nguyên

Biến self.account sẽ trỏ đến tài khoản mà chúng tôi đã sử dụng làm mục tiêu triển khai cho hợp đồng của mình. Như chúng ta đã tìm hiểu trước đây: hợp đồng thông minh không được triển khai trong không gian tên toàn cầu trên mạng Luồng, nhưng trong bộ nhớ trên chuỗi đặc biệt thuộc tài khoản của bạn. Vì vậy, hợp đồng thông minh biết nó được triển khai cho tài khoản nào và có thể sử dụng thông tin đó trong các phương pháp của nó.

Trong ví dụ này, chúng tôi sử dụng phương pháp lưu của tài khoản. Trong hàm init cuối cùng, chúng tôi di chuyển tài nguyên vào đối số đầu tiên của phương thức save và cho nó biết đường dẫn nào bên trong tài khoản sẽ lưu trữ NFT của chúng tôi.


Vì NFT của chúng tôi là một tài nguyên nên không thực thể nào trên mạng Flow có thể sao chép nó; chúng ta không cần phải theo dõi tính duy nhất của nó một cách rõ ràng.

Bản tóm tắt

Cadence là một ngôn ngữ lập trình hợp đồng thông minh mới, được tối ưu hóa để tạo và quản lý tài sản. Đó là một giải pháp thay thế hiện đại giúp giảm thiểu những khiếm khuyết của Solidity thông qua các phương tiện như quản lý cưỡng bức các biến và tài nguyên, kiểm soát bảo mật và truy cập ở cấp độ cơ bản cũng như khả năng nâng cấp các hợp đồng thông minh trước khi biến chúng thành bất biến. Cadence mở ra cho bạn các khả năng của hệ sinh thái Flow và kết hợp nhiều tính năng từ các ngôn ngữ như Rust.


Vì vậy, nếu bạn là một nhà phát triển muốn viết các hợp đồng thông minh bằng một ngôn ngữ cơ bản an toàn hơn và bảo mật hơn, thì Cadence là một lựa chọn tuyệt vời. Để tìm hiểu thêm, hãy xem Cổng thông tin dành cho nhà phát triển luồngtài liệu nhịp điệu.


Có một ngày thực sự tuyệt vời!