5
tập trung vào
741
Người theo dõi

Giới thiệu về Blockchain và Ethereum

Được tạo ra trong: 2016-05-05 17:31:57, cập nhật trên: 2016-05-05 17:32:31
comments   3
hits   2228

Trong khi đó, các nhà phân tích khác lại cho rằng, các nhà phân tích đã tìm ra một cách thức để phân tích các thông tin từ blockchain.

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

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

blockchain-hash-tree

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

Trong một cấu trúc dạng cây, mỗi node cuối có một giá trị phân tán, trong khi giá trị phân tán của node không cuối được phân tán từ giá trị phân tán của tất cả các node con trực tiếp của nó, do đó mỗi node trực tiếp hoặc gián tiếp chứa thông tin của tất cả các node con của nó. Do đó, bất cứ khi nào giá trị phân tán của một node cuối thay đổi, giá trị phân tán của tất cả các node cha của nó cũng sẽ thay đổi và các node gốc cũng sẽ thay đổi.

Tôi có thể đưa ra một ứng dụng về HashTree: “100% chứng minh số tiền dự trữ”, thuộc loại chứng minh không kiến thức. Chúng ta có thể xem xét một kịch bản mà chủ sở hữu Bitcion cần phải gửi Bitcoin cho sàn giao dịch để giao dịch, và về mặt lý thuyết sàn giao dịch có thể lấy số tiền này (tất cả số dư tài khoản của 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: sàn giao dịch trước tiên công bố một địa chỉ Bitcoin mà họ đang giữ, và mọi người xác nhận rằng sàn giao dịch thực sự có số lượng Bitcoin 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ố dư của tất cả người dùng?

blockchain-proof-of-reserves

Hình ảnh:<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 node cuối đại diện cho một người dùng, bao gồm số dư của người dùng ((Σ) và ID người dùng (ví dụ như địa chỉ thư điện tử)h), trong khi node cha chứa tổng số dư của các node con của nó (sum) và phân tích thông tin của tất cả các subnode ((hashĐối với mỗi người dùng, chỉ cần hiển thị cho nó nút cuối của mình và các nút anh em, tất cả các nút cha và các nút anh em của nó, vì người dùng này có thể xác nhận số dư của mình được bao gồm trong nút cha và cuối cùng trong nút gốc bằng cách đi ngược lại các nút cha.

Bằng cách này, thông tin được 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, và 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 cần thông báo cho người khác sử dụng số dư.hVì sao?e4df9d12Các node không nên là một node cuối đại diện cho người dùng, mà phải là một node thông tin được tổng hợp (thì nó có thể bao gồm một người dùng có số dư 3333, và một người dùng ảo có số dư 0) để tránh rò rỉ thông tin riêng tư của một người dùng.

Tiếp theo, chúng ta sẽ xem xét Git, một ứng dụng Blockchain rất điển hình:

blockchain-git-objects-example

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

Trong Git, dù là tập tin (Blob), chỉ mục (Tree) hay giao dịch (Commit), có một Hash được xác định bởi nội dung của nó, nếu hai đối tượng có cùng nội dung, thì có cùng Hash. Trong Git, toàn bộ lịch sử của kho là một Blockchain, mỗi Commit tương đương với một Block, Commit chứa Hash của Commit trước đó và Hash của đối tượng liên quan đến lần này, Hash của Commit đượ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 Commit sau đó sẽ thay đổi Hash. 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ử.push --force), nhưng sự thay đổi này sẽ được tất cả các đồng tác giả nhận thấy.

Một ứng dụng cổ điển khác của Blockchain là Bitcoin, và chính Bitcoin đã đưa ra thuật ngữ Blockchain (trong khi khái niệm này đã tồn tại từ lâu):

blockchain-bitcoin-block-data

Hình ảnh: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ổ sách phân quyền duy nhất. Bởi vì một khối mới được tạo ra mỗi mười phút, và một khi khối được tạo ra, nó sẽ mãi mãi ở trên Blockchain, vì vậy Blockchain sẽ cố định thứ tự giao dịch xảy ra, duy trì thứ tự giao dịch xảy ra trước và sau, và xác định xem một tài khoản có đủ số dư để thực hiện một giao dịch hay không.

Bitcoin

Phần đầu tiên của bài chia sẻ này là một cái nhìn ngắn gọn về Bitcoin.

Việc tạo ra khối trong Bitcoin được thực hiện thông qua “chứng minh khối lượng công việc”, nghĩa là tất cả các thợ mỏ tham gia vào “khai thác” phải thực hiện một tính toán ngẫu nhiên liên quan đến sức mạnh tính toán cho đến khi tính toán một số ngẫu nhiên đáp ứng các điều kiện cụ thể để 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 “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 và đáp ứng các quy tắc, nếu không thì sức mạnh tính toán của bạn sẽ bị lãng phí vì các thợ mỏ khác cũng luôn chấp nhận chuỗi dài nhất, và nếu bạn không bắt đầu làm việc dựa trên chuỗi dài nhất, thì đó là sức mạnh tính toán của tất cả các thợ mỏ khác.

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 mọi người bằng cách quan sát khoảng thời gian của vài khối trước để điều chỉnh độ khó của điều kiện tạo ra khối tiếp theo. Khi tốc độ tạo ra một vài khối trước đó cao hơn 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.

Tuy nhiên, hiện nay blockchain hoàn chỉnh đã có 66G và đang tăng lê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 của Bitcoin lưu trữ toàn bộ blockchain thì không phải là quá khó khăn, vì vậy Bitcoin có một cơ chế “Simplified payment verification (SPV) “, được gọi là “khách hàng hạng nhẹ” có thể chọn không lưu trữ toàn bộ blockchain, nhưng chỉ lưu trữ tất cả các thành phần của Block (hàm chứa giao dịch, chứng minh khối lượng công việc của Hash), sau đó xác minh khối lượng công việc của mỗi khối, và mỗi khi cần xác minh giao dịch, hãy truy vấn vào Blockchain hoàn chỉnh để tìm hiểu về khối giao dịch, sau đó lấy thông tin cần thiết để xác minh xem giao dịch có chứa trong Block hay không.

blockchain-bitcoin-state-machine

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

  • Blockchain Thẻ sổ cái Thẻ nhật ký thay đổi trạng thái
  • Transaction Transaction Transaction Một lần thay đổi trạng thái
  • Một “thỏa thuận” về tình hình hiện tại

Trên thực tế, chúng ta có thể tưởng tượng Blockchain của Bitcoin là một “máy trạng thái”, toàn bộ Blockchain là một “sách sổ” có trạng thái, trong đó lưu trữ các bản ghi giao dịch, dựa trên các bản ghi giao dịch, có thể tính toán toàn bộ sổ sách tại bất kỳ thời điểm nào. Mỗi giao dịch là một sự thay đổi về trạng thái, và mỗi khối là một “thỏa thuận” về trạng thái hiện tại của thợ mỏ trên toàn bộ mạng Bitcoin, bởi vì Bitcoin tạo ra một khối mới mỗi 10 phút, tương đương với mỗi 10 phút mọi người sẽ đạt được một sự đồng thuận về số dư của tất cả các tài khoản, trong mười phút này, trạng thái của sổ sách thực sự là một trạng thái hỗn loạn.

Alt Coin

Một số loại tiền mã hóa khác cũng được tạo ra từ Bitcoin, thường được gọi là “Alt Coin”, thường có hai cách thực hiện:

Một trong số đó là sử dụng mạng riêng, độc lập với Bitcoin, lợi thế là đồng tiền giả có thể thiết kế các giao thức và quy tắc của riêng mình một cách rất linh hoạt, nhưng do số lượng người dùng khó đạt được mức tương đương với Bitcoin, nên 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.

Lợi ích của việc 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 giả, 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 khách hàng và không thể sử dụng chức năng xác nhận đơn giản được đề cập ở trên của Bitcoin.

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

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

Ethereum

blockchain-ethereum

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

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

Trước khi giới thiệu về Ethereum, tôi sẽ giới thiệu về hai nền tảng của mạng phi tập trung: mã hóa và trò chơi. Không có gì khác hơn là bảo đảm an ninh toán học thông qua mã hóa khóa công khai, chữ ký số, phân tích và thuật toán tổng hợp; và trò chơi là trong mạng phi tập trung, bất cứ ai, bao gồm cả những người muốn tấn công mạng có thể tham gia.

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

Vì vậy, trong mạng 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ệ”, 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 các ưu đãi kinh tế. Cũng vì nhu cầu của “công cụ khuyến khích kinh tế”, Ethereum cũng có một hệ thống ví (đơn vị tiền tệ được gọi là “Ether”) và mỗi người dùng có một địa chỉ ví như là nhận dạng duy nhất của nó, tương tự như Bitcion về điểm này.

“Contract” là khái niệm quan trọng nhất được Ethereum giới thiệu. 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 đến một cặp chìa khóa công cộng và riêng tư. Nhưng trong Ethereum, ngoài địa chỉ được sở hữu bởi một cặp chìa khóa, còn có một địa chỉ được sở hữu bởi “mã”, đó là Contract.

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

Ví dụ đầu tiên là ví của nhiều người dùng, có một tính năng để tạo ví cho nhiều người dùng trong khách hàng chính thức của Ethereum:

blockchain-ethereum-multi-sig-wallet

Ví dụ, bạn có thể tạo ra một địa chỉ ví 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, bạn 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 Contract, và logic trên được mô tả thông qua mã trong Contract. Khi bạn muốn thanh toán từ ví chung này, bạn cần gửi một tin nhắn đến ví chung này ((thương mại là tin nhắn, số tiền giao dịch có thể là 0, chỉ mang dữ liệu), sau đó mã trong ví chung sẽ được thực hiện, nếu yêu cầu thanh toán phù hợp với logic trên, giao dịch thanh toán thực sự sẽ được thực hiện, nếu không yêu cầu thanh toán sẽ bị từ chối ((không có thanh toán 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ỷ giá hối đoái của tiền tệ pháp lý) không ổn định, thường xuyên tăng gấp đôi hoặc giảm gấp đôi giá trị tiền tệ trong một ngày, nhưng nếu thực hiện một hợp đồng bảo hiểm bằng Contract, vấn đề này có thể được giải quyết một cách nhất định.

Chúng ta sẽ gọi một người muốn giữ giá trị đồng tiền không thay đổi là “người tránh rủi ro” và một người khác sẵn sàng chịu rủi ro biến động giá trị đồng tiền và kiếm tiề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 gửi Ether trị giá 1000 CNY đến địa chỉ ví của Contract, người chịu rủi ro cũng gửi Ether trị giá 1000 CNY (hoặc nhiều hơn) đến Contract để thực hiện hợp đồng (nếu không có người thực hiện hợp đồng, người tránh rủi ro có thể lấy lại Ether của mình).
  • Một tháng sau, người tránh rủi ro có thể lấy lại Ether trị giá 1000 CNY từ Contract, và Ether còn lại được lấy lại bởi người chấp nhận rủi ro, bất kể tỷ giá trao đổi giữa Ether và CNY.

Nếu giá trị của Ether tăng lên, người chịu rủi ro sẽ kiếm được lợi nhuận, nếu giá trị của Ether giảm, người chịu rủi ro sẽ thua lỗ, nhưng người tránh rủi ro luôn luôn không thua lỗ. 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ề “bảo hiểm” mà người tránh rủi ro sẽ phải trả, cũng có thể thỏa thuận rằng người chịu rủi ro sẽ cần phải cung cấp bảo hiểm gấp đôi 1000 CNY (càng cao gấp đôi, rủi ro có thể chịu được càng lớn).

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

Chúng ta có thể thiết kế một Contract khác để chỉ định logic để thu thập tỷ giá trao đổi giữa Ether và tiền ảo từ thế giới thực, trong mỗi cửa sổ thời gian (ví dụ như một giờ):

  • Mọi người có thể trả 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 sẽ tính trung bình tỷ giá hối đoái được cung cấp bởi các chủ sở hữu ((theo số tiền bảo lãnh được cân nhắc)) và công bố.
  • Và số tiền bảo lãnh thu được sẽ được phân phối cho những người gần nhất với 25% giá trị trung bình (theo mức bảo lãnh được cân nhắc).

Đố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, gửi một tỷ giá thực có nhiều khả năng nhận được phần thưởng hơn, trong khi gửi một tỷ giá kỳ lạ sẽ có nhiều cơ hội bị mất tiền bảo lãnh.

Tất nhiên, có một vài lỗ hổng trong quy tắc này, chẳng hạn như nếu một người có rất nhiều tiền bảo hiểm, thì 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 tỷ giá hối đoái thực tế đồng thời nhận được phần thưởng, và làm cho một số người khác cung cấp tỷ giá hối đoái chính xác mất tiền bảo hiểm. Nhưng thực tế cũng vậy trong thế giới thực tế, nếu bạn có rất nhiều tiền cũng có thể nâng cao hoặc giảm giá của một loại hàng hóa, chỉ cần so với thế giới thực tế, khối lượng tiền điện tử rất nhỏ, không cần nhiều tiền để làm được điều đó; nhưng thực tế là tăng hoặc tăng tỷ giá hối đoái một cách ác ý cũng rất rủi ro, bởi vì bạn không chắc chắn mình đã trả bao nhiêu tiền bảo hiểm là đủ, nếu thất bại sẽ mất tất cả tiền bảo hiểm.

Một lỗ hổng khác là bước “bất cứ ai cũng có thể trả tiền bảo lãnh cho Contract và cung cấp một tỷ giá hối đoái” đượ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 tỷ giá hối đoái mà bạn cung cấp thực sự có thể nhìn thấy bởi những người khác, tạo ra cơ hội cho kẻ tấn công độc hại hơn nữa, và tôi sẽ giới thiệu cách tránh được vấn đề này bằng một ví dụ về “sản xuất số ngẫu nhiên”.

Trước đây chúng ta đã đề cập đến việc 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, thì chúng ta sẽ lấy một số ngẫu nhiên từ đâu?

Một nguồn số ngẫu nhiê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ể điều khiển số ngẫu nhiên này ở một mức độ nhất định, giả sử một thợ mỏ tham gia vào một trò chơi cờ bạc, và lợi nhuận của trò chơi cờ bạc lớn hơn lợi nhuận của việc đào một khối, thì nếu thợ mỏ đào một khối sẽ làm cho mình mất trò chơi cờ bạc, thì rõ ràng thợ mỏ sẽ chọn không công bố khối mới này, điều này càng rõ ràng khi sức mạnh tính toán của một thợ mỏ đơn lẻ.

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

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ố ngẫu nhiên mà không ai có thể dự đoán và can thiệp:

  • Giai đoạn 1: Mọi người có thể trả tiền bảo lãnh cho Contract và cung cấp “giá trị phân tích của một hạt giống được chọn ngẫu nhiên”.
  • Giai đoạn 2: Những người tham gia giai đoạn 1 cung cấp cho Contract những hạt giống chưa được gieo.
  • Kết thúc giai đoạn II: Contract phân loại tất cả các hạt giống hợp pháp, tạo ra một nhóm số ngẫu nhiên và công bố; quay trở lại giai đoạn II với tiền bảo lãnh của người cung cấp hạt giống chính xác.

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

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

Trong khi đó, Ethereum đã một lần nữa vượt qua vấn đề này bằng cách sử dụng “động lực kinh tế”. Hợp đồng được thực hiện dưới dạng mã điều hành (opcode) trên một máy ảo gọi là EVM (máy ảo Ethereum), EVM là một máy ảo tự “truyền” và trong tiêu chuẩn của EVM, mỗi loại Gas được tiêu thụ bởi opcode được xác định dựa trên bộ nhớ và thời gian CPU cần thiết để hoạt động, đây là một loại tài nguyên tính toán được mua bởi Ether.

Sau đó, chúng ta sẽ thảo luận lại vấn đề “thời gian đồng thuận” (consensus interval) mà chúng ta đã đề cập đến trước đó, Bitcoin có một khối mới được tạo ra mỗi 10 phút, nghĩa là toàn bộ mạng lưới đạt được một “thỏa thuận” mỗi 10 phút, vì vậy giao dịch Bitcoin thông thường phải chờ mười phút trước khi được xác nhận, và có thể phải chờ một giờ trước khi giao dịch này được coi là đáng tin cậy.

Điều này là do khoảng thời gian đồng thuận nhanh hơn sẽ làm tăng phần nào lợi thế của “khu mỏ tập trung”. Cái gọi là “khu mỏ” có nghĩa là các thợ mỏ Bitcoin tập hợp với nhau để khai thác mỏ, các thợ mỏ tuân theo các chỉ thị của thợ mỏ một cách vô điều kiện, và cuối cùng chia sẻ lợi nhuận với thợ mỏ. Rõ ràng, Bitcoin là một hệ thống phi tập trung, không muốn thợ mỏ tập trung có lợi thế bổ sung.

Khi một thợ mỏ A khai thác một khối mới, anh ta sẽ phát sóng khối này ra, 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 này khi nhận được thông báo này. Trong khi những người khác tính toán khoảng thời gian giữa “A khai thác khối mới” và “những tin nhắn phát sóng A” thực sự bị lãng phí, những thợ mỏ khác trong bể mỏ tập trung sẽ không có vấn đề này, bởi vì họ có thể nhận được thông tin về khối mới được tạo ra 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, thời gian này không quan trọng đối với 10 phút, nhưng nếu rút ngắn khoảng cách đồng thuận, lợi thế của mỏ khoan tập trung sẽ ngày càng rõ ràng. 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 cách đồng thuận xuống còn 15 giây, Bitcoin có sự cải thiện lớn về tốc độ xác nhận thanh toán.

Trong Blockchain của Bitcoin, một khối chỉ có thể 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 chú. Trở lại ví dụ trên, nếu một người đào một khối mới trong A nhưng người khác chưa nhận được thời gian phát sóng, nếu ai đó đào một khối mới, nhưng vì phát sóng muộn hơn không được mọi người chấp nhận, thì khối này có khả năng trở thành “uncle” của khối tiếp theo.

blockchain-ethereum-uncles

Hình ảnh:<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 đề mà Ethereum vẫn chưa giải quyết được.

Đầu tiên là Ethereum hiện vẫn đạt được sự đồng thuận và Bitcoin cũng được bảo đảm thông qua POW (chứng minh khối lượng công việc), chỉ cần hoàn thành một số lượng công việc nhất định để 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í một lượng lớn công suất tính toán để đảm bảo an toàn của mạng, mặc dù nó cũng dựa trên ý tưởng “động lực kinh tế” mà chúng tôi đã đề cập trước đó, nhưng thực sự có thể được cải thiện.

POS nghĩa là mỗi node muốn tham gia vào việc tạo ra một khối (còn được gọi là khai thác theo nghĩa truyền thống) (được gọi là người xác nhận) cần phải trả một khoản bảo lãnh cho hệ thống (đây là một quy định của hệ thống trong giao thức, tất cả các node đều cho rằng khoản bảo lãnh này đã được “đóng băng”) và sau đó sử dụng tiền bảo lãnh của riêng bạn để đăng ký một khối có thể trở thành khối tiếp theo (một điều kiện quan trọng của cái gọi là “có thể” là khối này phải phù hợp với các quy định của thỏa thuận), nếu khối này thực sự trở thành một khối tiếp theo, tất cả các node đã đăng ký sẽ được thưởng, nếu không, bảo lãnh sẽ bị loại bỏ.

Mô hình này thực sự rất giống với POW, trong POW, thợ mỏ sử dụng sức mạnh tính toán của riêng mình để “đặt cược” và nếu có một chuỗi dài hơn, cần phải chuyển sang chuỗi này để tiếp tục khai thác Bởi vì càng nhiều người tham gia, chuỗi càng có khả năng trở thành chuỗi chính xác, cuối cùng mọi người đạt được một sự đồng thuận. Trong POS, mọi người sử dụng tiền bảo lãnh của riêng mình để đặt cược, mọi người cũng có xu hướng chọn khối đã được đặt cược bởi nhiều người khác (nếu nó là hợp pháp), đạt được một sự đồng thuận cuối cùng.

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

Lý do tại sao POS vẫn chưa được áp dụng là do 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% giống như POW, tập trung 51% công suất trên toàn mạng trong POW có một số giới hạn vật lý vì công suất cần thiết bị tính toán để cung cấp; so với Ether 51% trên toàn mạng trong POS là dễ dàng hơn khi bạn có đủ tiền.

Một chủ đề khác là “phân mảnh”, cả Bitcoin và Ethereum, hiện đang xác nhận tất cả các giao dịch trên cùng một Blockchain, điều này hạn chế đáng kể khả năng tính toán của một mạng phân tán. Mỗi nút cần nhận, lưu trữ và xác minh mỗi giao dịch, và khả năng xử lý của toàn bộ mạng thực sự tương đương với khả năng xử lý của một nút.

Do đó, Ethereum muốn trong tương lai giới thiệu một cơ chế “phân mảnh” để chia toàn bộ mạng thành một số phần, giữa các phần độc lập để xác minh giao dịch. Nhưng các phân mảnh sẽ sử dụng cấu trúc chỉ số để tham khảo dữ liệu của các phân mảnh khác, bằng cách gọi đồng bộ để ảnh hưởng đến các phân mảnh 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 mảnh 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 hạn chế, vì vậy tôi không thể giới thiệu quá nhiều.

Contract

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

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");
  }
}

Đây là một số biểu hiện của ngữ pháp cốt lõi, trong Solidity bạn có thể tuyên bố biến trạng thái (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ể định nghĩa 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 để thực hiện, vì vậy một Contract có thể cung cấp một số hàm, trong hàm có thể đưa ra phán đoán logic, vòng lặp, sửa đổi giá trị số lượng.

Ngôn ngữ này có một số tính năng nhỏ tiện dụng, chẳng hạn như các thuật toán mật mã phổ biến.sha256Đơn vị chuyển đổi10 finney“Tôi không biết, tôi không biết, tôi không biết.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(Và vân vân)msgContract có thể gọi mã của một Contract khác bằng hai cách: bằng cách gọi mã của một Contract khác và bằng cách gọi mã của một Contract khác.delegatecallĐiều này tương đương với việc đưa code của một Contract khác vào context hiện tại để thực thi, giống như là đưa vào một hàm của một thư viện; trong khicallTrong khi đó, một giao dịch mới sẽ tạo ra một Contract mới.

Làm thế nào để Contract đọ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 thành “thứ biến trạng thái”, storedData là một biến trạng thái. Thực tế, thay đổi biến trạng thái trong quá trình thực thi Contract không được lưu vào blockchain, bởi vì Contract thực thi là tính toán xác định.

Tiếp theo, tôi sẽ giới thiệu một Contract Coin thực sự có thể sử dụng để phát hành một token riêng 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ã nguồn:http://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

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

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

Chúng tôi cũng tuyên bố một tên gọi khác:SentTrong thực tế, các sự kiện sẽ không có bất kỳ tác dụng thực tế nào, chỉ đơn giản là để in các sự kiện quan trọng khi khởi động, và trong tương lai cũng sẽ thuận tiện cho việc thực hiện các khách hàng hạng nhẹ (các khách hàng hạng nhẹ chỉ chấp nhận sự kiện mà không thực hiện hợp đồng).

blockchain-ethereum-mix

Ethereum cung cấp một IDE gọi là Mix để khởi động mã này, 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, và bạn cũng có thể thấy sự thay đổi của giá trị của mỗi biến trạng thái trong quá trình thực hiện. Điều đáng nói là một khi hợp đồng được phát hành, nó không thể được sửa đổi, 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 viết lỗi mỗi ngày, nhưng ngữ nghĩa của hợp đồng là “hợp đồng”, một khi bạn phát hành một hợp đồng tự nhiên không thể sửa đổi nó, ai sẽ tin tưởng hợp đồng của bạn?

Sau khi viết xong, chúng ta có thể sử dụng ví Ethereum để đưa Contract lên mạng:

blockchain-ethereum-create-contract

Sau khi được phát hành, bạn có thể theo dõi bản Contract này bằng cách truy cập vào các thông tin chi tiết của Contract:

blockchain-ethereum-wallet-contract

Ở bên trái là giá trị của hai biến trạng thái,minterVà tôi nghĩ rằng tôi đã làm được điều đó.balancesVì nó là một bảng xếp hạng, bạn có thể nhập một địa chỉ để tìm kiếm số dư của nó. Ở bên phải bạn có thể bắt đầu giao dịch mới với Contract này, và có một menu thả xuống để chọn.sendHoặc là…minthàm, bạn có thể điền vào các tham số được chuyển đến Contract. Bởi vì ở đây chúng tôi gửi giao dịch với mục đích chuyển một tin nhắn, chứ không phải chuyển Ether, vì vậy chúng tôi không cần phải thiết lập số tiền giao dịch.

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

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ã đơn giản hóa<https://ethereumpyramid.com/contract.html

Có một đoạn mã rất đơn giản, và nó nói rằng “Contract”participantsCác mảng được sử dụng để lưu trữ các địa chỉ ví của tất cả những người tham gia theo thứ tự, hoặc tuyên bố mộtpayoutIdxNó được sử dụng để ghi lại số người tham gia trước đó đã được trả lại 3 Ether.enterĐể thực hiện chức năng chính của Contract, đầu tiên là kiểm tra các tham số, đảm bảo rằng mỗi người tham gia đã trả 1 Ether, sau đó đưa người tham gia mới vàoparticipantsCuối cùng, nếu số của người tham gia hiện tại là một số nhân của 3 thì bạn sẽ gửi 3 Ether cho người tham gia thứ nhất.payoutIdxMột người tham gia, và sẽ là một người phụ trách.payoutIdxChỉ dẫn người tham gia tiếp theo

Liên kết tham khảo

HashTree:

  • Các nhà nghiên cứu đã phát hiện ra một loại cây thông minh có tên là Merkle Tree.
  • 100% chứng minh dự trữ
  • Mô hình đối tượng Git http://gitbook.liuhui998.com/1_2.html

Bitcoin:

Halting Problem:

  • Giới hạn của tính toán: tự ám chỉ và không thể xác định

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: