Tác giả gốc: Vitalik Buterin
Bản tổng hợp gốc: kim & Ajian, người đam mê Ethereum
Mặc dù nhiều khái niệm về Ethereum đã được sử dụng trong các loại tiền điện tử trước đó (chẳng hạn như Bitcoin) và nó đã được thử nghiệm trong 5 năm, nhưng xét về cách xử lý một số chức năng giao thức nhất định, Ethereum vẫn rất khác so với các phương thức thông thường. Hơn nữa, Ethereum có thể được sử dụng để phát triển các công cụ kinh tế hoàn toàn mới vì nó có nhiều tính năng mà các hệ thống khác không có. Bài viết này sẽ trình bày chi tiết tất cả các lợi ích tiềm năng của Ethereum, cũng như một số khía cạnh gây tranh cãi khi xây dựng giao thức Ethereum. Ngoài ra, những rủi ro tiềm ẩn của giải pháp và giải pháp thay thế của chúng tôi cũng sẽ được chỉ ra.
Ether Thiết kế của giao thức Fang tuân theo các nguyên tắc sau:
2.Quyền tự do: Người dùng không nên bị hạn chế sử dụng Giao thức Ethereum, cũng không nên có bất kỳ nỗ lực nào nhằm ưu tiên hỗ trợ hoặc không hỗ trợ các hợp đồng hoặc giao dịch Ethereum nhất định. Điều này tương tự như nguyên tắc chỉ đạo đằng sau khái niệm "trung lập ròng". Giao thức giao dịch Bitcoin không tuân theo nguyên tắc này: giao thức giao dịch Bitcoin không khuyến khích "các mục đích ngoài nhãn" của chuỗi khối (ví dụ: lưu trữ dữ liệu, siêu giao thức) (lưu ý hiệu đính: Ý nghĩa ban đầu của ngoài nhãn hiệu là sử dụng một loại thuốc điều trị một tình trạng khác với chỉ định đã được phê duyệt, chẳng hạn như sử dụng thuốc giảm ho để điều trị chứng đau đầu); và đôi khi, nó được sử dụng - Thay đổi lớp giao thức (chẳng hạn như giới hạn độ dài của trường OP_RETURN ở mức 40 byte) để tấn công các ứng dụng sử dụng blockchain theo cách "trái phép" (Ghi chú hiệu đính: Đây là một sự châm biếm đối với cộng đồng Bitcoin kiểm duyệt xu hướng Bitcoin trong việc sử dụng blockchain). Do đó, trong Ethereum, chúng tôi kiên quyết ủng hộ việc chỉ sử dụng phí giao dịch để đạt được cách tiếp cận gần như tương thích với khuyến khích - người dùng tiêu thụ càng nhiều tài nguyên trên mạng thì mức giá mà họ phải trả càng cao, tức là ngay cả khi họ hoặc cô ấy tự chịu chi phí (tức là Thuế Pigou).
Phần này mô tả những thay đổi đối với giao thức lớp blockchain trong Ethereum, bao gồm cách thức hoạt động của các khối và giao dịch, cách thức hoạt động, cách dữ liệu được tuần tự hóa và lưu trữ, cơ chế đằng sau tài khoản.
Bitcoin và nhiều biến thể của nó, tất cả số dư của người dùng Thông tin được lưu trữ trong cấu trúc UTXO, và toàn bộ trạng thái của hệ thống bao gồm một chuỗi "đầu ra chưa tiêu" (bạn có thể coi những "đầu ra chưa tiêu" này như những đồng tiền) (Lưu ý hiệu đính: Một phép ẩn dụ tốt hơn có thể là "kiểm tra".). Mỗi UTXO có một chủ sở hữu và thuộc tính giá trị riêng. Khi một giao dịch sử dụng nhiều UTXO, nó cũng sẽ tạo ra một số UTXO mới và giao dịch đó phải tuân theo các yêu cầu về tính hợp lệ sau:
1. hợp lệ và không được sử dụng;
2. Chữ ký của giao dịch phải trùng với chữ ký của chủ sở hữu mỗi đầu vào
3. lớn hơn tổng giá trị sản lượng.
Do đó, trong hệ thống Bitcoin, "số dư" của người dùng là tất cả các mục mà khóa riêng của người dùng có thể sử dụng một cách hiệu quả dấu hiệu Tổng số UTXO. Hình dưới đây cho thấy quá trình đầu vào và đầu ra giao dịch trong hệ thống Bitcoin:

- Phương pháp kế toán ba bút toán được Bitcoin sử dụng-
Tuy nhiên, Ethereum đã từ bỏ giải pháp UTXO để chuyển sang một cách tiếp cận đơn giản hơn: sử dụng khái niệm trạng thái để lưu trữ một loạt tài khoản, mỗi tài khoản có số dư riêng và dữ liệu dành riêng cho Ethereum (mã và bộ nhớ trong). Nếu số dư tài khoản của người khởi tạo giao dịch đủ để trả phí giao dịch, giao dịch hợp lệ thì tài khoản của người khởi tạo giao dịch sẽ bị ghi nợ số tiền tương ứng và tài khoản nhận sẽ được ghi có số tiền này. Trong một số trường hợp, nếu có mã cần được thực thi trong tài khoản nhận, giao dịch sẽ kích hoạt việc thực thi mã và bộ nhớ trong của tài khoản có thể thay đổi, thậm chí có thể tạo và gửi thêm tin nhắn đến các tài khoản khác. , dẫn đến các giao dịch mới xảy ra.
Mặc dù Ethereum không áp dụng khái niệm UTXO, nhưng UTXO có một số ưu điểm:
1. Mức độ bảo vệ quyền riêng tư cao hơn: Nếu người dùng sử dụng địa chỉ mới cho mỗi giao dịch, sẽ khó liên kết các tài khoản với nhau. Điều này phù hợp với các hệ thống tiền tệ có yêu cầu bảo mật cao, nhưng nó không phù hợp với bất kỳ dapp nào. Bởi vì các dapp thường cần theo dõi các trạng thái ràng buộc phức tạp của người dùng và trạng thái của các dapp không thể phân chia đơn giản như trạng thái trong hệ thống tiền tệ.
Cây Merkle Patricia/trie, do Alan Reiner nghĩ ra và triển khai trong giao thức Ripple, là cấu trúc dữ liệu chính của Ethereum và được dùng để lưu trữ tất cả trạng thái tài khoản cũng như từng dữ liệu Giao dịch và biên nhận trong các khối. MPT là sự kết hợp của cây Merkle và cây Patricia. Cấu trúc được tạo bằng cách kết hợp hai cây này có các thuộc tính sau:
1 Bất kỳ bộ khóa nào -Băm gốc. value tương ứng với cặp giá trị là duy nhất. Nếu bạn muốn nói dối rằng một cặp key-value nào đó tồn tại trong một cây nào đó thì chắc chắn nó sẽ bị nhìn thấu (trừ khi kẻ tấn công có sức mạnh tính toán khoảng 2^128).
2. Độ phức tạp về thời gian của việc thêm, xóa và sửa đổi một cặp khóa-giá trị là logarit.
MPT cung cấp cho chúng ta một "dấu vân tay" hiệu quả, dễ cập nhật, đại diện cho toàn bộ cây trạng thái. Mô tả chi tiết hơn về MPT: https://github.com/ethereum/wiki/wiki/Patricia-Tree.
Các quyết định thiết kế cụ thể của MPT như sau:
1. có hai loại nút:nút KV và nút rời rạc. Sự hiện diện của các nút KV cải thiện hiệu quả vì chúng có thể đóng vai trò là "phím tắt" để nén chiều cao của cây nếu cây thưa thớt ở một khu vực cụ thể (đọc đặc tả MPT để biết thêm chi tiết).
2. Các nút rời rạc có dạng thập lục phân, không phải nhị phân: Điều này làm cho việc tìm kiếm hiệu quả hơn. không lý tưởng vì hiệu quả tra cứu của cây hex có thể được mô phỏng ở dạng nhị phân bằng cách lưu trữ các nút theo lô. Tuy nhiên, việc triển khai cấu trúc cây MPT rất dễ xảy ra lỗi và cuối cùng sẽ dẫn đến ít nhất một gốc trạng thái không khớp, vì vậy chúng tôi đã quyết định tạm dừng các thay đổi cho đến phiên bản 1.1.
3. Không có sự khác biệt giữa giá trị trống và giá trị không phải thành viên: Điều này được thực hiện để đơn giản Về mặt logic, giá trị (cân bằng) số tài khoản không được kích hoạt trong Ethereum mặc định là 0 và các chuỗi trống cũng được biểu thị bằng 0. Tuy nhiên, cần nhấn mạnh rằng điều này làm mất đi tính linh hoạt và do đó không tối ưu.
4. Sự khác biệt giữa điểm đầu cuối (điểm cuối) và điểm không đầu cuối:Về mặt kỹ thuật, nó xác định xem một nút có phải là điểm cuối hay không point. Điều này là không cần thiết, vì tất cả các cây trong Ethereum đều được sử dụng để lưu trữ dữ liệu có độ dài cố định (tức là độ dài của khóa), nhưng để tăng tính linh hoạt, chúng ta vẫn sẽ thêm mã định danh này để mong đợi việc triển khai. MPT của Ethereum Có thể được áp dụng giống như các loại tiền điện tử khác.
5. Sử dụng SHA3(k) làm khóa trong "Cây bảo mật" (cây trạng thái và cây lưu trữ tài khoản):Sử dụng SHA3(k) , các cuộc tấn công DoS trở nên khó khăn hơn nhiều bằng cách tạo ra nhiều tài khoản (tài khoản có thể có tới 64 cấp độ trong cây trạng thái!) và liên tục gọi các mã opcode SLOAD và SSTORE. Lưu ý rằng điều này cũng khiến việc liệt kê cây trở nên khó khăn hơn; nếu bạn muốn kích hoạt khả năng liệt kê trên máy khách của mình, cách dễ nhất là duy trì ánh xạ cơ sở dữ liệu sha3(k) ->.
Ghi chú hiệu đính: Ý nghĩa ở đây là nếu k được dùng làm chìa khóa để lưu trữ dữ liệu trong cây Merkle thì khả năng phân phối của nó có thể rất thưa thớt và kẻ tấn công sẽ có thể dễ dàng Lập kế hoạch cho các tài khoản yêu cầu đường dẫn cây sâu để lưu trữ và liên tục gọi các hoạt động truy cập trạng thái trên các tài khoản này làm quá tải các nút trong mạng. Tuy nhiên, kết quả của hàm băm được phân phối ngẫu nhiên, với sha3(k ) làm khóa. sự phân bố các khóa đồng đều hơn và chiều cao của cây sẽ ngắn hơn).
Tính năng này cũng có những ưu và nhược điểm, một mặt nó có nghĩa là các cuộc tấn công DoS sẽ trở nên khó khăn hơn, mặt khác nó cũng khiến cho việc tấn công trở nên khó khăn hơn. Các đường dẫn truy cập cây trạng thái giao dịch hiếm khi trùng nhau, vì vậy mỗi lần tìm kiếm là trường hợp xấu nhất xét về độ phức tạp.
Ngoài ra, điều này cũng khiến MPT không phù hợp để đạt được "không trạng thái" (bản thân khối mang dữ liệu cần thiết để xác minh và người xác minh không cần phải có toàn cầu trạng thái), bởi vì Các đường dẫn truy cập trạng thái không trùng nhau và hiệu quả về mặt không gian của bằng chứng cũng là trường hợp xấu nhất. Tất nhiên, cũng có thể nói rằng bản thân hiệu quả không gian của bằng chứng cây Merkel chưa đủ cao
RLP (tiền tố độ dài đệ quy): tiền tố độ dài đệ quy.
Mã hóa RLP là định dạng tuần tự hóa chính trong Ethereum và nó được sử dụng ở mọi nơi: khối, giao dịch, trạng thái tài khoản và thông báo giao thức mạng. Xem mô tả chính thức về RLP để biết chi tiết: https://github.com/ethereum/wiki/wiki/RLP
RLP được dự định là một giải pháp nâng cao định dạng tuần tự hóa được đơn giản hóa, mục đích duy nhất của nó là lưu trữ các mảng byte lồng nhau 3. Không giống như các giải pháp hiện có như protobuf và BSON, RLP không xác định bất kỳ loại dữ liệu cụ thể nào, chẳng hạn như Boolean, float, double hoặc số nguyên. Nó chỉ đơn giản lưu trữ cấu trúc dưới dạng một mảng lồng nhau và giao thức xác định ý nghĩa của mảng đó. RLP không hỗ trợ rõ ràng các bộ sưu tập bản đồ. Đề xuất bán chính thức là sử dụng một mảng lồng nhau của [[k1, v1], [k2, v2], ...] k2 ... Sắp xếp chuỗi theo tiêu chí của chúng.
Một giải pháp có chức năng tương tự như RLP là protobuf hoặc BSON, là những thuật toán được sử dụng mọi lúc. Tuy nhiên, trong Ethereum, chúng tôi thích sử dụng RLP hơn vì: (1) dễ triển khai; (2) tính nhất quán của byte được đảm bảo tuyệt đối.
Bộ sưu tập cặp khóa-giá trị trong nhiều ngôn ngữ không có thứ tự rõ ràng và có nhiều trường hợp đặc biệt trong định dạng dấu phẩy động, có thể gây ra lỗi cùng một dữ liệu để tạo ra các bảng mã khác nhau và giá trị băm khác nhau. Thông qua thỏa thuận phát triển nội bộ, chúng tôi có thể đảm bảo rằng nó được thiết kế phù hợp với những mục tiêu này (đây là nguyên tắc chung cũng áp dụng cho các phần khác của mã, chẳng hạn như máy ảo). Bencode, mã hóa được BitTorrent sử dụng, có thể thay thế cho RLP. Tuy nhiên, nó sử dụng mã hóa thập phân, kém hơn một chút so với RLP nhị phân.
Cả giao thức mạng và cơ sở dữ liệu đều sử dụng thuật toán nén tùy chỉnh. dữ liệu. Thuật toán có thể được mô tả như sau: sử dụng mã hóa độ dài chạy 4 cho 0 trong khi vẫn giữ các giá trị khác (ngoại trừ một số trường hợp đặc biệt như sha3(' ') ), ví dụ:
>>> nén('ngựa')'ngựa'
>>> nén('con lừa rồng 1231231243') 'rồng lừa 1231231243'
>>> nén('\xf8\xaf\xf8\xab\xa0\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00 \x00\x00\xbe{b\xd5\xcd\x8d\x87\x97')'\xf8\xaf\xf8\xab\xa0\xfe\x9e\xbe{b \xd5\xcd \x8d\x87\x97'>>> nén("\xc5\xd2F\x01\x86\xf7#<\x92~}\xb2\xdc\xc7 \x03\xc0 \xe5\x00\xb6S\xca\x82';{\xfa\xd8\x04]\x85\xa4p")『\xfe\x01'
Trước khi thuật toán nén tồn tại, có một số trường hợp đặc biệt ở nhiều nơi trong giao thức Ethereum. Ví dụ: sha3 thường được xác định lại để sha3(' ')=' ', điều này loại bỏ nhu cầu lưu trữ. mã trong tài khoản và tiết kiệm được 64 byte. Tuy nhiên, gần đây tất cả các trường hợp đặc biệt khiến cấu trúc dữ liệu của Ethereum bị cồng kềnh đã bị loại bỏ và thay thế bằng cách thêm các chức năng lưu dữ liệu vào một lớp bên ngoài giao thức blockchain, tức là đưa nó vào giao thức mạng cũng như Chèn cơ sở dữ liệu người dùng. Điều này làm tăng tính mô-đun, đơn giản hóa lớp đồng thuận và làm cho việc cập nhật và triển khai liên tục các thuật toán nén tương đối đơn giản (ví dụ: nó có thể được phân biệt và triển khai theo số phiên bản của giao thức mạng).
Nhắc nhở: Để hiểu được phần kiến thức này cần có người đọc hiểu Nguyên lý của bộ lọc Bloom 5 . Bạn có thể tìm thấy phần giới thiệu tại:
http://en.wikipedia.org/wiki/Bloom_filter
Mỗi vùng trong Ethereum blockchain Tiêu đề khối chứa các con trỏ tới ba cây: cây trạng thái, cây giao dịch và cây biên nhận.
• Cây trạng thái biểu thị toàn bộ trạng thái sau khi xử lý khối;
• Cây giao dịch đại diện cho tất cả các giao dịch trong khối, được khóa theo chỉ mục (ví dụ: k0: giao dịch được thực hiện đầu tiên, k1: giao dịch được thực hiện thứ hai)
• Cây biên nhận thể hiện biên nhận tương ứng cho mỗi giao dịch.
Biên nhận giao dịch là cấu trúc dữ liệu được mã hóa RLP:
[ medstate, gas_used, logbloom, logsTrong số đó:
• medstate: Sau khi xử lý giao dịch, gốc của cây trạng thái;
• gas_used: lượng gas sử dụng sau khi xử lý giao dịch;
• logs: là danh sách gồm nhiều phần tử [địa chỉ, [topic1, topic2...], data] . Các phần tử này được tạo bởi các opcodes LOG0 ... LOG4 được gọi trong quá trình thực hiện giao dịch (bao gồm cả các lệnh gọi chính và phụ); địa chỉ của hợp đồng đã tạo ra nhật ký có tối đa bốn chủ đề 32 byte; giá trị ;dữ liệu là một mảng byte có kích thước bất kỳ;
• logbloom: Bộ lọc Bloom bao gồm địa chỉ và chủ đề của tất cả nhật ký trong giao dịch.
Ngoài ra còn có bộ lọc Bloom trong tiêu đề khối, là kết quả OR của tất cả các bộ lọc Bloom của các giao dịch trong khối. Cấu trúc này làm cho giao thức Ethereum cực kỳ thân thiện với khách hàng.
1.UTXO: đầu ra giao dịch chưa được chi tiêu, nghĩa đen là : Đầu ra giao dịch chưa chi tiêu là đầu ra giao dịch không được bất kỳ giao dịch nào tham chiếu làm đầu vào. Nó là cấu trúc dữ liệu được sử dụng trong giao thức Bitcoin để lưu trữ thông tin giá trị (quyền sở hữu). --Ghi chú hiệu đính
2.Nonce, viết tắt của Số được sử dụng một lần hoặc Số một lần, trong mật mã, Nonce là một giá trị ngẫu nhiên tùy ý hoặc không lặp lại, chỉ được sử dụng một lần, trong công nghệ mã hóa Cả hai vectơ ban đầu và hàm băm mật mã đóng vai trò quan trọng trong việc đảm bảo rằng thông tin xác minh không được sử dụng lại trong các ứng dụng truyền thông của các giao thức xác minh khác nhau để chống lại các cuộc tấn công lặp lại. --Ghi chú của người dịch
3. Mảng lồng nhau: Tạo một mảng và điền vào mảng đó bằng các mảng khác. Ví dụ: mảng thú cưng:
var cats : String[] = ["Cat", "Beansprout", "Pumpkin", "Max"];var dogs : String[] = [ "Dog","Oly","Sib"];
var pet : String = [mèo, chó];
— —Ghi chú của người dịch
4. Mã hóa thời lượng chạy: mã hóa thống kê. Kỹ thuật chính là phát hiện các chuỗi bit hoặc ký tự lặp lại và thay thế chúng bằng số lần chúng xuất hiện. (Baidu Encyclopedia) - Translator's Note
5. Bộ lọc Bloom: Cấu trúc dữ liệu vectơ nhị phân được đề xuất bởi Howard Bloom vào năm 1970. Nó có hiệu quả về không gian và thời gian tốt và được sử dụng để phát hiện một phần tử không phải là thành viên của bộ. (Bách khoa toàn thư Baidu) - Ghi chú của người dịch
Liên kết gốc
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia