Blockchain và Ethereum

Tác giả:Không, Tạo: 2016-05-05 17:31:57, Cập nhật: 2016-05-05 17:32:31

Nguồn gốc:https://jysperm.me/2016/05/blockchain-slides/

Bài viết này được biên soạn từ bài chia sẻ kỹ thuật của tôi trên LeanCloud vào cuối tháng 3, giả sử rằng người đọc đã có kiến thức mật mã cơ bản và hiểu biết ban đầu về việc thực hiện Bitcoin.

Blockchain cũng được gọi là blockchain và có thể được coi là một loại HashTree, vì vậy nó có một số tính chất tương tự như HashTree:

blockchain-hash-tree

Hình ảnh từhttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Ví dụ, trong một cấu trúc cây, mỗi nút cuối cùng có một giá trị phân đoạn, và giá trị phân đoạn của các nút không cuối cùng được phân đoạn bởi tất cả các nút con trực tiếp của nó, do đó, mỗi nút trực tiếp hoặc gián tiếp chứa thông tin của tất cả các nút con của nó.

Tôi có thể đưa ra một ứng dụng về HashTree: "Chứng minh dự trữ 100%", nó thuộc loại vấn đề "Chứng minh kiến thức không". Chúng ta có thể xem xét một tình huống mà chủ sở hữu Bitcion cần gửi Bitcoin đến sàn giao dịch để thực hiện giao dịch, và theo lý thuyết sàn giao dịch có thể chuyển số tiền này (tỷ lệ dư tài khoản của tất cả người dùng) để sử dụng nó, điều mà người dùng không muốn nhìn thấy, và sàn giao dịch cũng muốn tự minh bạch: sàn giao dịch trước tiên công bố một địa chỉ Bitcoin mà họ nắm giữ, cho phép mọi người xác nhận rằng sàn giao dịch thực sự giữ số lượng Bitcoin như dự trữ, nhưng làm thế nào để chứng minh số tiền này thực sự lớn hơn tổng số tiền của tất cả người dùng?

blockchain-proof-of-reserves

Hình ảnh từhttp://blog.bifubao.com/2014/03/16/proof-of-reserves

Chúng ta có thể xây dựng một HashTree, tất cả các nút cuối đại diện cho một người dùng, chứa số dư người dùng.Σ) và một loạt các ID người dùng (ví dụ như địa chỉ hộp thư)h), trong khi các nút cha chứa tổng số dư của các nút con của nósum) và phân đoạn thông tin của tất cả các nút con (((hashĐối với mỗi người dùng, chỉ cần hiển thị cho họ các nút cuối cùng và các nút em trai của mình, tất cả các nút cha và các nút em trai của họ, vì người dùng có thể xác nhận số dư của mình được bao gồm trong các nút cha và cuối cùng được bao gồm trong các nút gốc bằng cách theo dõi các nút cha từng bước.

Điều này làm cho thông tin hiển thị cho mỗi người dùng chỉ có thông tin của riêng mình và một số thông tin đã được tổng hợp, mỗi người dùng có thể xác nhận số dư của mình được bao gồm trong nút gốc mà không biết số dư sử dụng khác.hĐểe4df9d12Các nút không nên là một nút cuối đại diện cho người dùng, mà nên là một nút thông tin được tổng hợp (đây là một nút có thể chứa một người dùng với 3333 dư số, và một người dùng giả với 0 dư số) để tránh rò rỉ thông tin riêng tư của một người dùng.

Bây giờ chúng ta hãy xem Git, thực sự Git là một ứng dụng Blockchain rất điển hình:

blockchain-git-objects-example

Hình ảnh từhttp://gitbook.liuhui998.com/1_2.html(GPL v2)

Trong Git, dù là một tập tin (Blob), một chỉ mục (Tree) hoặc một giao dịch (Commit), tất cả đều có một Hash được xác định bởi nội dung của nó, và nếu hai đối tượng có cùng nội dung, thì họ cũng có cùng một Hash. Trong Git, lịch sử của toàn bộ kho là một Blockchain, mỗi Commit tương đương với một Block, trong đó Commit chứa Hash của Commit trước đó và Hash của đối tượng liên quan được sửa đổi, Commit chính nó được xác định bởi nội dung và thông tin này.

Git sử dụng Blockchain để xác định một lịch sử duy nhất cho kho. Ồ, nếu một Commit được sửa đổi, tất cả các Hash của Commit sau đó sẽ thay đổi. Tất nhiên, vì Git chỉ là một công cụ kiểm soát phiên bản, nó không ngăn bạn sửa đổi lịch sử ((bạn có thể rebase sau khi tất cả))push --forceCác tác giả của bài viết này đều có thể nhận thấy sự thay đổi này.

Một ứng dụng cổ điển khác của Blockchain là Bitcoin, và chính Bitcoin đã phổ biến từ Blockchain (và khái niệm này đã tồn tại từ lâu):

blockchain-bitcoin-block-data

Hình ảnh từhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

Trong Bitcoin, mỗi khối chứa một loạt các giao dịch và Hash của khối trước đó, trong khi toàn bộ Blockchain tạo thành một sổ cái đơn giản và phi tập trung. Vì mỗi mười phút một khối mới được tạo ra và một khối được tạo ra sẽ ở lại trên Blockchain mãi mãi, Blockchain cố định thứ tự giao dịch, duy trì thứ tự giao dịch trước và sau đó xác định xem một tài khoản có đủ số dư để bắt đầu giao dịch hay không.

Bitcoin

Phần đầu tiên của bài chia sẻ này là đơn giản là xem lại Bitcoin.

Việc tạo ra khối trong Bitcoin được thực hiện bằng "bằng chứng khối lượng công việc", nghĩa là tất cả các "người thợ mỏ" tham gia "khai thác" phải thực hiện một phép tính phân đoạn có liên quan đến sức tính tính toán, có tính chất ngẫu nhiên, cho đến khi một số ngẫu nhiên đáp ứng một điều kiện nhất định được tính toán để có được quyền phát hành một khối.

Theo thiết lập, mỗi thợ mỏ sẽ luôn tin tưởng vào "lưu chuỗi dài nhất" và tính toán khối tiếp theo dựa trên chuỗi dài nhất được biết đến, đáp ứng các quy tắc, nếu không, sức mạnh tính toán của bạn sẽ bị lãng phí hoàn toàn.

Bitcoin được thiết kế để tạo ra một khối mới mỗi 10 phút, thời gian này được thực hiện bởi tất cả mọi người cùng nhau xem xét khoảng thời gian của một vài khối trước để điều chỉnh điều kiện tạo của khối tiếp theo. Khi các khối trước được tạo ra nhanh hơn so với dự kiến, mọi người sẽ cho rằng việc tạo ra khối tiếp theo nên có độ khó cao hơn.

Thông thường, mỗi nút Bitcoin cần lưu trữ toàn bộ dữ liệu Blockchain để xác nhận một giao dịch có hợp pháp hay không. Nhưng hiện nay, blockchain hoàn chỉnh đã có 66G và đang phát triển với tốc độ khoảng 0.1G mỗi ngày. Nếu yêu cầu mỗi người dùng Bitcoin lưu trữ toàn bộ blockchain không phải là quá khó khăn, vì vậy Bitcoin có một cơ chế "Simplified confirmation SPV, Simplified payment verification", được gọi là "khách hàng hạng nhẹ" có thể chọn không lưu trữ toàn bộ blockchain mà chỉ lưu trữ tất cả các thông tin (Hash, bao gồm số lượng giao dịch, và công việc), sau đó xác minh khối lượng công việc, mỗi khi cần xác minh giao dịch hoàn chỉnh tại điểm giao dịch.

blockchain-bitcoin-state-machine

Hình ảnh từhttps://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain sổ cái nhật ký thay đổi trạng thái
  • Transaction Transaction Một lần thay đổi trạng thái
  • Block đã tạo ra một sự đồng thuận về tình hình hiện tại.

Trong thực tế, chúng ta có thể tưởng tượng Blockchain của Bitcoin như một "máy tính trạng thái", toàn bộ Blockchain là một "đăng sổ" có trạng thái, trong đó lưu trữ các ghi chép về mỗi giao dịch, dựa trên những ghi chép này, có thể suy luận về trạng thái của toàn bộ sổ vào bất kỳ thời điểm nào.

Alt Coin

Nhiều loại tiền điện tử khác, thường được gọi là "Alt Coin", cũng được phát triển dựa trên Bitcoin và thường có hai triển khai:

Đầu tiên là sử dụng mạng riêng, độc lập so với Bitcoin, lợi ích của nó là nó có thể rất linh hoạt trong việc thiết kế các giao thức và quy tắc của riêng mình, nhưng vì số lượng người dùng rất khó đạt đến mức độ tương đương với Bitcoin, khả năng phòng thủ chống lại các cuộc tấn công độc hại sẽ rất yếu.

Cách thứ hai là sử dụng mạng lưới Bitcoin để thực hiện "métro-protocol", kèm theo thông tin tùy chỉnh trên Transaction của Bitcoin để thực hiện logic của riêng mình, lợi ích như có thể sử dụng quy mô tính toán của Bitcoin để chống lại các cuộc tấn công, nhưng đồng thời vì gắn liền với mạng Bitcoin, không phải tất cả các thợ mỏ sẽ tuân thủ các quy tắc của đồng tiền điện tử, do đó không thể ngăn chặn các khối không tuân thủ quy tắc vào Blockchain, chỉ có thể lọc các giao dịch không tuân thủ quy tắc trên máy khách, cũng không thể tận dụng chức năng xác nhận đơn giản được Bitcoin đề cập ở trên.

Đối với những đồng tiền này, Bitcoin có thể cung cấp một Blockchain có sự tham gia của nhiều thợ mỏ, có thể chống lại các cuộc tấn công độc hại lớn, đồng thời có thể chứa dữ liệu tùy chỉnh trên Transaction của Bitcoin, để lại một số không gian cho việc thực hiện đồng tiền.

Bitocin cũng cung cấp mộtBitcoin ScriptTuy nhiên, vì đây không phải là chức năng cốt lõi của Bitcoin, nó chỉ có thể thực hiện các phép tính tương đối đơn giản, đọc dữ liệu trên Blockchain rất hạn chế, và rất khó để viết logic tổng quát, hoàn chỉnh Turing vì thiếu cơ chế xoay vòng.

Ethereum

blockchain-ethereum

Hình ảnh từhttps://www.ethereum.org/assets(CC 3.0)

Ethereum (Ethereum) là một nền tảng ứng dụng phân quyền dựa trên blockchain, xây dựng cơ sở hạ tầng của Bitcoin dựa trên công nghệ blockchain mật mã để tạo ra một nền tảng phổ biến và bổ sung một số tính năng bị thiếu của mạng Bitcoin để các nhà phát triển có thể chạy ứng dụng phân quyền của mình trên Blockchain.

Trước khi giới thiệu chi tiết về Ethereum, tôi sẽ giới thiệu về hai nền tảng của mạng lưới phân quyền (như tôi nghĩ) là mã hóa và cờ bạc. Tất nhiên, mã hóa không cần phải nói nhiều hơn là đảm bảo an ninh bằng toán học thông qua mã hóa khóa công khai, chữ ký kỹ thuật số, phân đoạn và thuật toán tóm tắt; và cờ bạc là trong mạng lưới phân quyền, bất cứ ai, bao gồm cả những người có ý định tấn công mạng lưới này có thể tham gia, cần phải suy nghĩ về mối quan hệ lợi ích của mỗi người tham gia trong việc thiết kế mạng lưới phân quyền, đảm bảo lợi ích tối đa khi tuân thủ các quy tắc và khi vi phạm các quy tắc sẽ bị tổn thất hoặc chịu rủi ro.

Tuy nhiên, trong thế giới kỹ thuật số, việc phát hành một đoạn dữ liệu là không có chi phí, không có "lợi ích" và "mất mát" và do đó phải có một số kết nối với thế giới thực để xác định "lợi ích". Ví dụ trong mạng Bitcoin, nếu kẻ tấn công muốn thay đổi hướng của Blcokchain một cách nhân tạo, nó sẽ cần có sức mạnh tính toán cao hơn tất cả các thợ mỏ khác, trong khi trong thế giới thực, sức mạnh tính toán là cần thiết để cung cấp thiết bị tính toán, và thiết bị tính toán là cần phải mua từ thế giới thực.

Vì vậy, trong một mạng lưới phi tập trung, không phải tất cả các vấn đề đều được giải quyết bởi "công nghệ", những phần mà công nghệ không thể đạt được phải được giải quyết bằng lợi nhuận, bằng khuyến khích kinh tế. Và vì nhu cầu về "nỗ lực kinh tế", Ethereum cũng có một hệ thống ví (đơn vị tiền tệ gọi là "Ether") và mỗi người dùng có địa chỉ ví như một biểu tượng duy nhất, tương tự như Bitcion về điểm này.

"Contract" là khái niệm quan trọng nhất được giới thiệu bởi Ethereum. Trong Bitcoin, tất cả các địa chỉ đều thuộc về một người dùng. Khi chúng ta nói "người dùng", chúng ta thực sự nói về một cặp khóa công khai và khóa riêng. Nhưng trong Ethereum, ngoài địa chỉ được sở hữu bởi một khóa, còn có một địa chỉ được sở hữu bởi "mã số", đó là Contract.

  • Có thể và chỉ có thể được sử dụng với blockchain như là đầu vào và đầu ra, do đó tính toán là lặp đi lặp lại.
  • Bạn có thể gọi các hàm trong các hợp đồng khác (mã và dữ liệu của các hợp đồng khác cũng tồn tại trên blockchain).
  • Trong quá trình thực hiện, các giao dịch mới có thể được tạo ra (làm điều khiển số dư ví của riêng bạn) và các giao dịch này có thể thực hiện các hợp đồng khác.

Để bắt đầu với một ví dụ về ví đa người, trong khách hàng chính thức của Ethereum, có một chức năng tạo ví đa người:

blockchain-ethereum-multi-sig-wallet

Ví dụ, tính năng này có thể tạo ra một địa chỉ ví được sở hữu chung với 2 người khác, mỗi người sử dụng tối đa 100 Ether mỗi ngày, nếu vượt quá giới hạn này, phải có sự đồng ý của người khác.

Tính năng này thực sự tạo ra một hợp đồng, và logic trên được mô tả bằng mã trong hợp đồng. Khi bạn muốn chi tiêu từ ví chia sẻ này, bạn cần gửi một tin nhắn đến ví chia sẻ này (thương lượng giao dịch có thể là 0 và chỉ mang dữ liệu), sau đó mã trong ví chia sẻ sẽ được thực hiện, nếu yêu cầu chi tiêu phù hợp với logic trên, thì bắt đầu giao dịch chi tiêu thực sự, nếu không thì yêu cầu chi tiêu sẽ bị từ chối mà không có khoản chi tiêu thực sự.

Một ví dụ khác là "hợp đồng bảo hiểm", người ta luôn nói rằng Bitcoin là một loại tiền kỹ thuật số có giá trị tiền tệ (và tỷ lệ hối đoái của tiền tệ hợp pháp) không ổn định, thường xảy ra tình huống giá trị tiền tệ tăng gấp đôi hoặc giảm gấp đôi trong một ngày, nhưng nếu thực hiện một hợp đồng bảo hiểm bằng hợp đồng, vấn đề này có thể được giải quyết ở một mức độ nào đó.

Chúng ta sẽ gọi những người muốn giữ giá trị đồng tiền không thay đổi là "người tránh rủi ro", và những người khác sẵn sàng chịu rủi ro của sự biến động giá trị đồng tiền và kiếm được lợi nhuận từ đó là "người chịu rủi ro", vì vậy họ có thể thỏa thuận một số tiền (ví dụ 1000 CNY) và một cửa sổ thời gian (ví dụ một tháng) và tạo ra một Hợp đồng thực hiện logic sau:

  • Người tránh rủi ro sẽ gửi 1000 CNY Ether đến địa chỉ ví của Contract, và người chịu rủi ro sẽ gửi 1000 CNY (hoặc nhiều hơn) Ether đến Contract để thỏa thuận (nếu không có người thỏa thuận, người tránh rủi ro có thể lấy lại Ether của mình).
  • Sau một tháng, người tránh rủi ro có thể lấy lại 1000 CNY Ether từ Hợp đồng, và bất kể tỷ giá giữa Ether và CNY, Ether còn lại sẽ được người chịu rủi ro lấy lại.

Nếu giá trị của Ether tăng, người chịu rủi ro sẽ có lợi, nếu giá trị của Ether giảm, người chịu rủi ro sẽ mất, nhưng người tránh rủi ro sẽ luôn không bị tổn thất. Tất nhiên, người tránh rủi ro và người chịu rủi ro có thể thỏa thuận trước về "phí bảo hiểm" mà người tránh rủi ro sẽ phải trả, hoặc có thể thỏa thuận người chịu rủi ro sẽ phải cung cấp bảo hiểm gấp đôi 1000 CNY ("tỷ lệ nhân càng cao, rủi ro càng lớn").

Trong ví dụ trên, cũng có một vấn đề không được giải quyết tốt, đó là làm thế nào để xác định tỷ lệ hối đoái giữa Ether và tiền mã hóa, như chúng tôi đã đề cập trước đây, Contract chỉ có thể truy cập dữ liệu trên blockchain, và tiền mã hóa là dữ liệu tồn tại trong thế giới thực chứ không phải thế giới mật mã, chúng ta cần đưa những "dữ liệu từ thế giới không mật mã" vào blockchain thông qua một cơ chế nào đó.

Chúng ta có thể thiết kế một hợp đồng khác để chỉ ra logic như thế này để thu thập tỷ lệ hối đoái giữa Ether và tiền pháp lý từ thế giới thực, trong mỗi cửa sổ thời gian (ví dụ như một giờ):

  • Bất cứ ai cũng có thể đóng góp tiền bảo lãnh cho Contract và cung cấp một tỷ giá hối đoái.
  • Vào cuối cửa sổ thời gian, Contract tính toán và công bố giá trị trung bình của các tỷ giá mà tất cả mọi người cung cấp (được tính theo trọng số tiền bảo lãnh).
  • Và số tiền bảo lãnh thu được sẽ được phân chia cho 25% người gần trung bình nhất (theo mức cân nặng của số tiền bảo hiểm).

Đối với bất kỳ người tham gia nào, vì không biết giá cả của người khác, việc gửi một tỷ giá thực sự có khả năng cao hơn để nhận được phần thưởng, trong khi gửi một tỷ giá rất kỳ lạ sẽ có cơ hội lớn để mất tiền bảo lãnh.

Dĩ nhiên, quy tắc này có một vài lỗ hổng, ví dụ như nếu một người có rất nhiều tiền bảo hiểm, anh ta có thể kéo giá trung bình lên một mức giá cao hơn hoặc thấp hơn so với tỷ giá thực, đồng thời nhận được phần thưởng, và khiến một số người khác cung cấp tỷ giá chính xác mất tiền bảo hiểm. Nhưng thực tế cũng giống như thế trong thế giới thực, nếu bạn có rất nhiều tiền, bạn cũng có thể tăng hoặc giảm giá của một mặt hàng, chỉ là so với thế giới thực, khối lượng tiền điện tử vẫn còn nhỏ và không cần nhiều tiền để làm điều đó; nhưng thực tế, việc tăng hoặc giảm tỷ giá một cách ác ý cũng có một rủi ro rất lớn, bởi vì bạn không chắc chắn rằng bạn đã trả đủ tiền bảo hiểm, và nếu bạn thất bại, bạn sẽ mất tất cả tiền bảo hiểm.

Một lỗ hổng khác là "bất cứ ai cũng có thể đóng góp tiền bảo lãnh vào Hợp đồng và cung cấp một loại tiền tệ". Bước này được thực hiện bằng cách tạo giao dịch, và tất cả các giao dịch sẽ được viết trên Blockchain, vì vậy các loại tiền tệ mà bạn gửi thực sự có thể nhìn thấy được bởi những người khác, tạo thêm cơ hội cho những kẻ tấn công độc hại.

Trước đây chúng tôi đã đề cập đến Contract có thể đọc dữ liệu trên Blockchain, nhưng dữ liệu trên Blockchain là xác định, nếu chúng ta muốn thực hiện một ứng dụng tương tự như cờ bạc, chúng ta sẽ lấy số ngẫu nhiên từ đâu?

Một nguồn số ngẫu nhiên mà bạn có thể nghĩ đến là Hash của Block tiếp theo, trong hầu hết các trường hợp, mức độ ngẫu nhiên này là đủ. Nhưng thực tế là thợ mỏ có thể thao túng số ngẫu nhiên này ở một mức độ nào đó, giả sử một thợ mỏ tham gia vào một trò chơi và lợi nhuận của trò chơi lớn hơn lợi nhuận của một khối, thì nếu thợ mỏ này đào một khối sẽ khiến mình thua cuộc, thì rõ ràng thợ mỏ sẽ chọn không công bố khối mới, điều này càng rõ ràng trong trường hợp tính toán mạnh mẽ của một thợ mỏ duy nhất.

Do đó, chúng ta cần phải đưa ra một cơ chế tương tự như thu thập tỷ lệ hối đoái để thu thập số lượng hạt giống ngẫu nhiên và sau đó sử dụng những hạt giống đó để tính toán một số lượng ngẫu nhiên khác nhau vào cuối mỗi cửa sổ thời gian. Nhưng giống như thu thập tỷ lệ hối đoái, vì người tham gia thực hiện tỷ lệ hối đoái gửi bởi tạo giao dịch, do đó, trong khoảng thời gian giữa một cửa sổ thời gian, số lượng ngẫu nhiên mà mỗi người gửi được đều hiển thị cho những người khác, do đó, một người đã tham gia vào một cuộc đánh bạc có thể chọn một số lượng hạt giống ngẫu nhiên để số lượng hạt giống mà người khác đã gửi cộng với số lượng hạt giống ngẫu nhiên mới được tạo ra phù hợp với mong đợi của anh ta.

Vì vậy, chúng ta cần phải chia cửa sổ thu thập hạt giống thành hai phần để có được một số lượng ngẫu nhiên mà không ai có thể dự đoán và can thiệp:

  • Giai đoạn 1: Bất cứ ai cũng có thể đóng góp tiền bảo lãnh cho Contract và cung cấp "giá trị lô của một hạt giống được chọn ngẫu nhiên".
  • Giai đoạn 2: Người tham gia giai đoạn 1 cung cấp hạt giống chưa phân loại cho Contract.
  • Kết thúc giai đoạn 2: Hợp đồng sắp xếp tất cả các hạt giống hợp pháp, tạo ra một tập hợp số lượng ngẫu nhiên và công bố; trả lại tiền bảo lãnh cho người đã cung cấp hạt giống chính xác trong giai đoạn 2.

Trong giai đoạn đầu tiên, bạn chỉ biết giá trị phân đoạn của các loại hạt giống mà người khác đã nộp, nhưng không biết loại hạt giống thực tế, do đó không thể xây dựng một loại hạt giống để can thiệp vào kết quả; trong giai đoạn hai, tất cả mọi người chỉ xác nhận các loại hạt giống đã nộp trong giai đoạn đầu tiên, không thể nộp mới, cũng không thể ngăn chặn người khác nộp hạt giống.

Trước đây, chúng tôi đã đề cập đến Bitcoin Script không cung cấp khả năng xoay vòng, quay trở lại, nhảy vọt, v.v. Có lẽ Bitcoin là để kiểm soát thời gian thực hiện Bitcoin Script, bởi vì theo Thuyết dừng của Turing, các chương trình được viết bởi ngôn ngữ lập trình hoàn chỉnh của Turing không thể luôn luôn chỉ từ quan điểm phân tích tĩnh để quyết định liệu nó sẽ kết thúc sau một số bước giới hạn, do đó, những kẻ tấn công có thể xây dựng một Transaction gây ra vòng lặp chết để cản trở hoạt động bình thường của thợ mỏ.

Trong khi đó, Ethereum lại phá vỡ vấn đề này bằng cách "khuyến khích kinh tế" khi hợp đồng chạy dưới dạng mã điều hành opcode trên một máy ảo gọi là EVM (Ethereum Virtual Machine), một máy ảo có tính toán tự động, trong tiêu chuẩn của EVM, xác định lượng Gas được tiêu thụ bởi mỗi mã opcode theo bộ nhớ và thời gian CPU cần thiết cho hoạt động, một tài nguyên tính toán được mua bởi Ether. Như đã đề cập trước đây, khi mục tiêu của giao dịch là hợp đồng, mã của hợp đồng sẽ được thực hiện, người khởi xướng giao dịch sẽ phải trả tiền cho Gas Gas được tiêu thụ trong quá trình thực hiện hợp đồng, đồng thời tuyên bố "số lượng Gas Gas tối đa họ sẵn sàng trả" và nếu đường trung gian hết, hợp đồng sẽ ngừng thực hiện.

Sau đó, chúng ta sẽ thảo luận về vấn đề "khoảng cách đồng thuận" một lần nữa, trước đây đã đề cập đến Bitcoin mỗi 10 phút một khối mới xuất hiện, nghĩa là toàn bộ mạng lưới đạt được một "sự đồng thuận" mỗi 10 phút, vì vậy giao dịch Bitcoin thông thường sẽ phải chờ vài phút để được xác nhận, trong thời gian đầu tiên không quá mạnh, có thể chờ một giờ (từ 6 khối), trước khi mọi người nghĩ rằng giao dịch này là đáng tin cậy.

Điều này là bởi vì khoảng thời gian đồng thuận nhanh hơn sẽ làm tăng một số lợi thế của "mỏ tập trung". Cái gọi là "mỏ" có nghĩa là các thợ mỏ Bitcoin tập hợp với nhau để khai thác, các thợ mỏ nghe theo hướng dẫn của mỏ, cuối cùng thỏa thuận chia sẻ lợi nhuận với mỏ, rõ ràng là Bitcoin là một hệ thống phi tập trung, không mong muốn một mỏ tập trung như vậy có thêm lợi thế.

Khi một thợ mỏ A khai thác một khối mới, anh ta sẽ phát sóng khối đó, và những người khác sẽ ngay lập tức bắt đầu làm việc dựa trên khối mới khi họ nhận được thông báo này. Trong khi đó, người khác tính toán khoảng thời gian giữa "A khai thác khối mới" và "thông tin phát sóng từ A" thực sự bị lãng phí, trong khi các thợ mỏ khác trong bể mỏ tập trung sẽ không có vấn đề này, vì họ có thể nhận được thông tin về khối mới nhanh hơn và ngay lập tức bắt đầu làm việc dựa trên khối mới.

blockchain-ethereum-without-uncles

Thời gian phát sóng này có thể mất vài giây, và với 10 phút, thời gian này không quan trọng, nhưng lợi thế của các khối khai thác tập trung sẽ ngày càng rõ ràng nếu giảm khoảng cách đồng thuận. Nhưng Ethereum đã giải quyết vấn đề này bằng cách giới thiệu khái niệm "Uncle Block", giảm khoảng thời gian đồng thuận xuống còn 15 giây, nâng cao đáng kể so với Bitcoin về tốc độ xác nhận thanh toán.

Trong Blockchain của Bitcoin, một khối có thể chỉ có một khối cha và một khối con. Nhưng trong Ethereum, một khối mới được tạo ra có thể có một khối cha và một số khối con. Trở lại ví dụ trên, nếu một khối mới được khai thác tại A nhưng người khác chưa nhận được phát thanh trong thời gian phát sóng, nếu ai đó khai thác một khối mới, nhưng vì phát thanh muộn không được chấp nhận, thì khối này có khả năng trở thành khối "bộ tử" của khối tiếp theo.

blockchain-ethereum-uncles

Hình ảnh từhttps://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Vấn đề chưa được giải quyết

Trong phần tiếp theo, tôi sẽ giới thiệu một số vấn đề chưa được giải quyết của Ethereum.

Đầu tiên là Ethereum hiện nay vẫn đạt được sự đồng thuận bằng cách đảm bảo bằng POW (bằng chứng minh khối lượng công việc) giống như Bitcoin, chỉ có các node hoàn thành một số lượng công việc nhất định mới có thể tham gia vào công việc tạo ra khối, vấn đề của chứng minh khối lượng công việc là nó sẽ lãng phí rất nhiều sức tính để đảm bảo an toàn của mạng, mặc dù điều này cũng dựa trên ý tưởng "khuyến khích kinh tế" mà chúng tôi đã đề cập ở trên, nhưng thực sự có thể được cải thiện. Ehtereum cho rằng cách tốt hơn là thay thế bằng POS (bằng chứng minh quyền sở hữu) để chứng minh khối lượng công việc, điều này có thể cải thiện đáng kể hiệu quả của mạng.

Vì Ether là một giá trị, tại sao không sử dụng nó để tạo ra một ưu đãi kinh tế? POS là bảo đảm rằng mọi người sẽ sử dụng Ether mà họ có để đảm bảo rằng mỗi nút muốn tham gia tạo ra khối (trong nghĩa truyền thống là khai thác mỏ) được gọi là người xác thực sẽ cần phải gửi cho hệ thống một khoản bảo lãnh, tất cả các nút cho rằng số tiền bảo lãnh này đã được "đóng băng" và mọi người sẽ sử dụng số tiền bảo lãnh của họ để đặt cược vào khối có thể trở thành khối tiếp theo.

Mô hình này thực sự rất giống với POW, trong POW, các thợ mỏ đặt cược bằng sức tính của riêng họ, và nếu một chuỗi dài hơn, thì cần phải chuyển sang chuỗi này để tiếp tục khai thác.

POS chắc chắn sẽ làm tăng thông lượng cho toàn bộ mạng. Không còn cần thiết phải đạt được sự đồng thuận bằng cách thực hiện rất nhiều tính toán vô nghĩa, số lượng hoạt động của mỗi nút sẽ gần với số lượng tính toán thực hiện mã trong hợp đồng và thực hiện xác minh dữ liệu.

Tất nhiên, tại thời điểm này, POS vẫn chưa được áp dụng bởi vì vẫn còn một số vấn đề chưa được giải quyết, một trong số đó là vấn đề tấn công 51% như POW, trong đó POW tập trung toàn bộ mạng 51% có một giới hạn vật lý nhất định, bởi vì sức mạnh tính toán cần thiết để cung cấp thiết bị tính toán; trong khi đó, thu thập 51% Ether toàn mạng trong POS tương đối dễ dàng hơn, miễn là bạn có đủ tiền. POS tự nhiên không phức tạp hơn POW, để thực hiện logic làm việc trên, cần phải xử lý ví dụ như duy trì danh sách người kiểm chứng hiệu quả, tiền phạt, tiền phạt, không trả lại, đề xuất và đặt cược, ngăn chặn các cuộc tấn công liên minh giữa người kiểm chứng, khôi phục sau khi phân vùng mạng, v.v.

Một chủ đề khác là "snippets", dù là Bitcoin hay Ethereum, hiện tại tất cả các giao dịch được xác nhận trên cùng một Blockchain, điều này rất hạn chế khả năng tính toán của một mạng phân tán.

Vì vậy, Ethereum hy vọng trong tương lai sẽ giới thiệu một cơ chế "phân đoạn" để chia toàn bộ mạng thành một số phần, để xác minh giao dịch độc lập giữa chúng. Nhưng giữa các phân đoạn sẽ sử dụng cấu trúc chỉ số để tham khảo dữ liệu của các phân đoạn khác, qua cách gọi không đồng bộ để ảnh hưởng đến các phân đoạn khác, vì vậy toàn bộ mạng vẫn là một trong mắt người dùng, nhưng khả năng xử lý của toàn bộ mạng sẽ có khả năng mở rộng rất mạnh. Hiện tại, việc thực hiện liên quan đến phân đoạn giới hạn vẫn còn ở giai đoạn phát triển tương đối sớm, vì vậy tôi đã tìm thấy thông tin, vì vậy tôi sẽ không giới thiệu nhiều.

Hợp đồng

Trong phần này, tôi sẽ cho bạn thấy một số mã thực tế, có thể làm việc cho Contract. Contract có thể được viết bằng nhiều ngôn ngữ mô hình khác nhau, cuối cùng chúng sẽ được biên dịch thành opcode thực hiện trên EVM, và hôm nay chúng tôi chọn Solidity như một ví dụ về ngôn ngữ JavaScript, một trong những ngôn ngữ EVM được duy trì tốt nhất hiện nay.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Dưới đây là một số biểu diễn về ngữ pháp cốt lõi mà bạn có thể tuyên bố các biến trạng thái trong Solidity.uint storedData;Các giá trị của các biến này sẽ được lưu trữ vĩnh viễn trên Blockchain.structĐể tuyên bố cấu trúc dữ liệu phức tạp; cũng có thể xác định các hàm, các hàm này sẽ được thực hiện khi nhận giao dịch, người khởi tạo giao dịch có thể chọn các hàm nào được thực hiện, vì vậy một Contract có thể cung cấp một số hàm, trong đó các hàm có thể đưa ra các phán đoán logic, vòng lặp, thay đổi giá trị.

Một số chức năng nhỏ rất tiện dụng được xây dựng trong ngôn ngữ, chẳng hạn như các thuật toán mã hóa phổ biến (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((sha256), đơn vị chuyển đổi10 finneyBạn có thể viết địa chỉ ví của bạn ngay lập tức.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(Vỗ tay)msgLà một biến toàn cầu được xây dựng để đọc thông tin liên quan đến giao dịch, chẳng hạn như người khởi động, số tiền, v.v.delegatecallĐiều này tương đương với việc đặt mã của một Contract khác vào context hiện tại để thực hiện, giống như việc giới thiệu một hàm thư viện;callTrong khi đó, một hợp đồng mới có thể được khởi động để kích hoạt một hợp đồng khác.

Vậy làm thế nào để các hợp đồng đọc và viết dữ liệu từ blockchain? Công việc phức tạp này được trừu tượng hóa cho "sự thay đổi trạng thái", trong đó dữ liệu được lưu trữ là một biến trạng thái. Thực tế, các sửa đổi về biến trạng thái trong quá trình thực hiện hợp đồng không được lưu trong blockchain vì hợp đồng thực hiện là tính toán xác định.

Tiếp theo tôi sẽ giới thiệu một bản hợp đồng thực sự có thể sử dụng để phát hành một mã thông báo của riêng mình dựa trên mạng Ethereum:

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Mã được lấy từhttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example(MIT)

Một hợp đồng được gọi là Coin tuyên bố hai biến trạng thái, và một trong hai biến trạng thái là một trong hai biến trạng thái.minterNgười tạo ra mã thông báo này được sử dụng để lưu trữ, trong việc xây dựng chức năng (((function Coin()) đã gán cho biến số này giá trị của người khởi xướng giao dịch đầu tiên được sử dụng để tạo Hợp đồng; cũng tuyên bố một bảng đồ map địa chỉ ví đến sốbalances, được sử dụng để biểu thị số dư của địa chỉ của mỗi người nắm giữ mã thông báo.

mintTrong hàm này, trước tiên xác định xem người khởi xướng giao dịch có phải là người tạo ra mã thông báo hay không, nếu vậy, theo các tham số của hàm, một số lượng mã thông báo nhất định được thêm vào địa chỉ được chỉ định.sendChức năng này có thể được gọi bởi tất cả mọi người và sẽ khấu trừ một số lượng số dư nhất định từ địa chỉ khởi tạo giao dịch (nếu có đủ số dư) cộng với địa chỉ đích, tương đương với một chức năng chuyển tiền.

Chúng tôi cũng tuyên bố một cuộc gọiSentTrong tương lai, khách hàng hạng nhẹ cũng sẽ dễ dàng thực hiện ("Khách hàng hạng nhẹ chỉ chấp nhận các sự kiện mà không thực sự thực hiện hợp đồng").

blockchain-ethereum-mix

Ethereum cung cấp một IDE gọi là Mix để điều chỉnh đoạn mã này, ở phía bên phải của Mix bạn có thể tạo ra một số khối và tài khoản để kiểm tra hợp đồng của bạn, cũng như xem giá trị của mỗi biến trạng thái thay đổi như thế nào trong quá trình thực hiện. Đáng đề cập là Contract không thể thay đổi một khi được phát hành, sau đó hoạt động hoàn toàn dựa trên giao dịch của người khác, điều này sẽ rất khó chịu đối với các lập trình viên đang viết Bug mỗi ngày, nhưng ngữ nghĩa của Contract là "hợp đồng", nếu bạn phát hành một hợp đồng tự nhiên không thể sửa đổi nó, nếu không ai sẽ tin vào hợp đồng của bạn.

Sau khi viết xong, chúng ta có thể phát hành hợp đồng trên mạng bằng ví Ethereum:

blockchain-ethereum-create-contract

Sau khi được phát hành, bạn có thể theo dõi Contract này và chỉ vào giao diện chi tiết của Contract:

blockchain-ethereum-wallet-contract

Ở bên trái, bạn có thể thấy giá trị của hai biến trạng thái.minterNhững người khác cũng có thể tìm hiểu thêm về vấn đề này.balancesVì nó là một biểu đồ, bạn có thể nhập một địa chỉ để hỏi số dư của nó. Ở bên phải bạn có thể bắt đầu giao dịch mới cho hợp đồng này, có một menu thả xuống để chọnsendHoặcmintCác chức năng, bạn có thể điền vào các tham số chuyển tiếp cho Contract. Vì ở đây chúng ta gửi giao dịch để chuyển một thông điệp, chứ không phải để chuyển Ether, vì vậy chúng ta không cần phải đặt số tiền giao dịch.

Sau đây tôi sẽ giới thiệu một hợp đồng rất thú vị, một hợp đồng thực hiện hiệu ứng lừa đảo Ponzi, bạn có thể trả 1 Ether cho hợp đồng này để tham gia trò chơi, sau đó mỗi 3 người tham gia sẽ được trả 3 Ether cho những người tham gia trước theo thứ tự:

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

Mã được đơn giản hóa từhttps://ethereumpyramid.com/contract.html

Mã đơn giản hơn, Contract tuyên bố mộtparticipantsCác mảng được sử dụng để lưu trữ địa chỉ ví của tất cả những người tham gia theo thứ tự, hoặc tuyên bố mộtpayoutIdxSử dụng để ghi lại số người tham gia trước đó đã được trả lại 3 Ether.enterCác chức năng chính của việc thực hiện hợp đồng này là kiểm tra một số tham số, đảm bảo mỗi người tham gia được trả 1 Ether, và sau đó đưa người tham gia mới vàoparticipantsCuối cùng, nếu số trước của người tham gia hiện tại là số nhân của 3, bạn gửi 3 Ether cho người thứ ba.payoutIdxMột người tham gia và sẽpayoutIdxNhững người tham gia vào cuộc thi đã được chỉ dẫn đến người tiếp theo.

Liên kết tham khảo

HashTree:

Bitcoin:

Vấn đề dừng:

Ethereum:

Mạng Ethereum:

Tiếp theo của Ethereum:

Hợp đồng:

Hợp đồng IDE:


Thêm nữa

Giấc mơ nhỏTôi đã hoàn toàn hiểu, chỉ có thể hiểu một chút, hiểu quá ít.

xuanxuanCó lẽ ông chủ đã đi nghiên cứu BTC và ETH.

momoxKhông hiểu