Cách học tính vững chắc: Hướng dẫn mã hóa Ethereum cơ bản

Hướng dẫn này sẽ hướng dẫn bạn từng bước trong việc học Solidity. Để khám phá sâu hơn về độ vững chắc, vui lòng xem các khóa học blockchain của chúng tôi.

Quỹ Ethereum đã làm rung chuyển thế giới blockchain kể từ những ngày đầu của dự án, vào khoảng cuối năm 2013 và đầu năm 2014. Ethereum thực sự đã khởi động “Bitcoin 2.0” và những gì chúng tôi nghĩ là phong trào “blockchain”, sau lần đầu tiên lớn “Bong bóng” Bitcoin vượt $ 1000 USD trên thị trường đã thu hút sự chú ý của mọi người. Ethereum là một dự án blockchain với tiền điện tử, Ether, tương tự như Bitcoin, nhưng Ethereum có thêm tính năng của ngôn ngữ máy ảo (gần như) Turing- hoàn chỉnh và khả năng xử lý được nhúng vào việc triển khai nút.

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Máy ảo Ethereum (EVM) cho phép các nút Ethereum thực sự lưu trữ và xử lý dữ liệu để đổi lấy thanh toán, đáp ứng các sự kiện trong thế giới thực và cho phép rất nhiều cơ hội mới để hỗ trợ các ứng dụng trên chuỗi mà trước đây chưa từng có cho các nhà phát triển và thực- người dùng thế giới. Tôi đã có may mắn thực sự ở Thụy Sĩ vào đầu năm 2014, và được đến thăm một “holon” ​​của Ethereum và đi chơi với một số người sáng lập Ethereum trước khi bán mã thông báo Ether, khi họ “tự tài trợ”.

Tôi đã hỏi Mihai Alisie hợp đồng thông minh ethereum là gì và anh ấy giải thích:

“Hợp đồng thông minh là một cách để mọi người trên toàn cầu kinh doanh với nhau ngay cả khi họ không nói cùng một ngôn ngữ hoặc sử dụng cùng một loại tiền tệ”.

Vì vậy, đó thực sự là quan điểm mà tôi bắt đầu, ý tưởng rằng chúng tôi có thể xác định theo chương trình các quy tắc của hợp đồng kinh doanh, bằng một ngôn ngữ máy đơn giản, để mang mọi người lại với nhau và cho phép họ tiến hành kinh doanh theo cách đáng tin cậy, an toàn và tự động.

Bản thân Solidity Language là một công cụ mà chúng tôi sử dụng để tạo mã cấp máy có thể thực thi trên EVM, đó là một ngôn ngữ có trình biên dịch lấy mã cấp cao mà con người có thể đọc được và chia nó thành các hướng dẫn đơn giản như “đưa dữ liệu vào một thanh ghi”, “thêm dữ liệu từ hai thanh ghi”, “quay lại lệnh tại điểm nhớ xxxxx”, tạo cơ sở cho bất kỳ chương trình thực thi nào của bộ vi xử lý.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

Vì vậy, ngôn ngữ Solidity chỉ là một trong số các ngôn ngữ có thể được biên dịch thành EVM bytecode, một ngôn ngữ khác làm điều tương tự được gọi là Serpent. Mỗi ngôn ngữ có thể có một số công cụ biên dịch nhưng tất cả chúng đều làm cùng một việc, đó là tạo mã bytecode cấp máy EVM để chạy trên các nút ethereum, để thanh toán.

Cách học tính vững chắc

Bản thân solidity là một ngôn ngữ khá đơn giản, theo như các ngôn ngữ lập trình.

Trên thực tế, nó là một thu gọn có chủ đích, ngôn ngữ được đánh máy lỏng lẻo với cú pháp rất giống với ECMAScript (Javascript). Có một số điểm chính cần nhớ từ Cơ sở thiết kế Ethereum tài liệu, cụ thể là chúng tôi đang làm việc trong mô hình ngăn xếp và bộ nhớ với kích thước từ lệnh 32 byte, EVM cho phép chúng tôi truy cập vào chương trình “cây rơm” giống như một không gian thanh ghi nơi chúng ta cũng có thể gắn các địa chỉ bộ nhớ để tạo vòng lặp / bước nhảy của Bộ đếm chương trình (để điều khiển chương trình tuần tự), một “ký ức” và lâu dài hơn “lưu trữ” thực sự được viết vào blockchain vĩnh viễn và quan trọng nhất, EVM yêu cầu tổng số thuyết định mệnh trong các hợp đồng thông minh.

Yêu cầu đối với thuyết xác định này là lý do bạn sẽ không thấy hàm “random ()” trong ngôn ngữ Solidity. Khi một khối ethereum được “khai thác”, việc triển khai hợp đồng thông minh và các lệnh gọi hàm trong khối đó (có nghĩa là các lệnh được sắp xếp để xảy ra trong thời gian khối cuối cùng) sẽ được thực thi trên nút khai thác khối và trạng thái mới thay đổi thành bất kỳ không gian lưu trữ hoặc các giao dịch trong hợp đồng thông minh đó thực sự xảy ra trên nút khai thác đó. Sau đó, khối mới được truyền đến tất cả các nút khác và mỗi nút cố gắng xác minh độc lập khối, bao gồm cả việc thực hiện các thay đổi trạng thái tương tự đối với bản sao cục bộ của blockchain. Đây là nơi nó sẽ thất bại nếu hợp đồng thông minh hoạt động không xác định. Nếu các nút khác không thể đi đến thống nhất về trạng thái của blockchain sau khi khối mới và các hợp đồng của nó được thực thi, mạng có thể tạm dừng theo đúng nghĩa đen.

Đây là lý do tại sao các hợp đồng thông minh ethereum (và các hợp đồng thông minh nói chung trong bất kỳ hệ thống blockchain nào) phải có tính xác định: để mạng lưới các nút luôn có thể xác thực và duy trì sự đồng thuận về các khối mới sắp ra mắt, để tiếp tục chạy.

Một hạn chế khác mà bạn sẽ thấy trong hợp đồng thông minh EVM là không có khả năng truy cập dữ liệu bên ngoài “bộ nhớ” và “bộ nhớ”, (chúng tôi không muốn hợp đồng thông minh có thể đọc hoặc xóa ổ cứng của các nút mà nó chạy) và không có khả năng truy vấn các tài nguyên bên ngoài như với JQuery. Chúng tôi không thực sự có quyền truy cập vào nhiều chức năng thư viện như để phân tích cấu trúc JSON hoặc thực hiện số học dấu phẩy động và thực sự tốn kém chi phí để thực hiện các quy trình con đó hoặc lưu trữ nhiều dữ liệu trong chính blockchain ethereum.

Khi bạn gọi một hợp đồng thông minh thực hiện một số công việc hoặc tính toán thay đổi trạng thái (bất kỳ hành động nào ngoài việc chỉ đọc từ bộ nhớ), bạn sẽ phải chịu một gas “chi phí” đối với công việc được thực hiện bởi hợp đồng thông minh và chi phí gas này liên quan đến khối lượng công việc tính toán cần thiết để thực hiện chức năng của bạn. Đó là một loại hệ thống “thanh toán vi mô cho máy tính vi mô”, nơi bạn có thể mong đợi trả một lượng xăng nhất định cho một lượng tính toán nhất định, mãi mãi.

Bản thân giá gas có nghĩa là không đổi, có nghĩa là khi Ether tăng giá trên thị trường toàn cầu, giá bán của gas so với Ether sẽ giảm. Do đó, khi bạn thực hiện một lệnh gọi hàm tới một hợp đồng thông minh, bạn có thể nhận được ước tính về lượng gas bạn phải trả trước, nhưng bạn cũng phải chỉ định giá bán (tính theo ether trên mỗi gas) mà bạn sẵn sàng trả và các nút khai thác có thể quyết định xem đó có phải là tỷ lệ đủ tốt để họ nhận lệnh gọi hàm hợp đồng thông minh của bạn trong khối tiếp theo của họ hay không.

Hợp đồng thông minh có địa chỉ riêng của chúng, từ đó chúng có thể nhận và gửi Ether. Hợp đồng thông minh có thể theo dõi “người gọi” của chức năng theo cách có thể xác minh được, do đó, nó có thể xác định xem một trong các chức năng của nó có đang được gọi bởi tài khoản “chủ sở hữu” hoặc “quản trị viên” đặc quyền hay không và hành động tương ứng cho các chức năng quản trị. Họ có khả năng đọc dữ liệu từ chuỗi khối ethereum và truy cập thông tin về các giao dịch trong các khối cũ hơn. Nhưng các hợp đồng thông minh có “bị khóa” trong thế giới xác định nhỏ của riêng chúng, chỉ có thể nhận thức được dữ liệu được lưu trữ trong chính blockchain ethereum?

Không có gì! Đó là nơi “Oracles” vào. Chúng ta có thể gọi cho một nhà tiên tri sẽ cho chúng ta biết điều gì đó về thế giới bên ngoài một cách đáng tin cậy, và hành động trên dữ liệu đó trong hợp đồng thông minh. Điểm mấu chốt ở đây là mặc dù bản thân các sự kiện trong thế giới thực không phải là xác định, nhưng Oracle có thể được tin cậy để luôn trả lời yêu cầu của mọi nút về những gì đã xảy ra theo cách xác định, để tất cả các nút vẫn có thể đi đến thống nhất. Vì vậy, đây là cách Oracle đáng tin cậy hoạt động trên lý thuyết: một “nhà tiên tri” sẽ lấy một số dữ liệu, giả sử nguồn cấp dữ liệu giá cổ phiếu về giá cổ phiếu trong thế giới thực và ghi lại dữ liệu đó vào “bộ nhớ” trong một hợp đồng thông minh đơn giản của Oracle, một cái gì đó như thế này

(xem thêm phần giải thích đây):

function storeTickerData (ký hiệu byte8, mở, cao, thấp, đóng)

onlyOracle

lợi nhuận (bool thành công)

{

# lưu trữ dữ liệu mã cổ phiếu trên chuỗi

tickerData [Symbol] [block.number] = [mở, cao, thấp, đóng]

# tickerData là một bản đồ của các bản đồ, string => uint => mảng [uint, uint, uint, uint]

trả về true;

}

Có những công ty chuyên trở thành nhà tiên tri đáng tin cậy và thiết kế các hệ thống để họ không cần phải được tin cậy với nguồn cấp dữ liệu. Nếu chúng ta nhìn vào Tài liệu Oraclize chúng tôi thấy câu trích dẫn thú vị này:

Đặc biệt, mục đích không buộc các nhà phát triển hợp đồng thông minh phải tin tưởng Oraclize cung cấp dữ liệu họ cần. Nếu không có bất kỳ sự hỗ trợ nào về tính xác thực, Oraclize có thể dễ dàng giả mạo dữ liệu. Đây là lý do tại sao, để hoàn thành nhiệm vụ phức tạp này, Oraclize trả về dữ liệu được yêu cầu cùng với bằng chứng về tính xác thực: tức là dữ liệu đến từ nhà cung cấp dữ liệu đã được hợp đồng thông minh yêu cầu rõ ràng.

Vì vậy, bạn nên kiểm tra phần tài liệu đó trên “bằng chứng xác thực” để biết thêm chi tiết, nhưng ý tưởng là ngay cả khi những người nghiện ethereum mới, vào một thời điểm nào đó trong tương lai, quay các nút ethereum của họ và bắt đầu đồng bộ hóa chuỗi khối của họ với mạng , tất cả dữ liệu họ cần để thực thi tất cả các hợp đồng thông minh “phụ thuộc vào thần thánh” đó đều được an toàn trên chuỗi để họ tải xuống mãi mãi. Vấn đề ai trả tiền “xăng” cho nhà tiên tri để thực hiện tất cả việc ghi dữ liệu này về các sự kiện trong thế giới thực (lưu trữ blockchain “thay đổi trạng thái” tốn xăng) là một chủ đề khác, nhưng về cơ bản, nó được trả trước bởi người yêu cầu dữ liệu trong một trong nhiều cách. Điều thú vị ở đây là mặc dù chúng tôi không thể viết một hợp đồng thông minh “ném xúc xắc” theo nghĩa bao gồm sự ngẫu nhiên thực tế, nó thực sự có thể viết một hợp đồng thông minh phản ứng với việc ném một con súc sắc, như được điều hành bởi một nhà tiên tri.

Hướng dẫn cơ bản về Solidity

Cơ sở mã cơ bản và thiết lập

Vì vậy, hãy bắt đầu với một hợp đồng thông minh ethereum cơ bản, được viết bằng ngôn ngữ Solidity. Cách tốt nhất để học là làm! Chúng ta có thể thấy từ đoạn mã nhỏ ở trên rằng chúng ta có một cú pháp khai báo hàm khá đơn giản và một số Loại dữ liệu như ‘uint’ (số nguyên không dấu) và ‘string’, và chúng tôi thấy trong tài liệu, chúng tôi cũng có các loại biến như ‘address’, chứa các phương thức ‘.balance’ và ‘.transfer’, có thể dự đoán trả lại số dư tại Ethereum và cho phép hợp đồng thông minh thực sự gửi Ether đến địa chỉ đó, với các đơn vị có giá trị Wei.

Chúng tôi có các mảng, enum, toán tử, cấu trúc dữ liệu băm cơ bản của bạn được gọi là ‘ánh xạ’ và một số đặc biệt được xác định trước đơn vị và vars toàn cầu trong đó bao gồm những thứ như blockheight, dấu thời gian của khối cuối cùng và một số hàm thao tác SHA-hash và địa chỉ / phím tiện dụng. Một điều quan trọng về Solidity khi làm việc với mảng đa chiều: lập chỉ mục theo thứ tự “đảo ngược” so với hầu hết các ngôn ngữ chỉ trong khi khai báo, như đã lưu ý trong tài liệu:

Một mảng có kích thước cố định k và kiểu phần tử T được viết là T [k], một mảng có kích thước động là T []. Ví dụ, một mảng gồm 5 mảng động của uint là uint [] [5] (lưu ý rằng ký hiệu bị đảo ngược khi so sánh với một số ngôn ngữ khác). Để truy cập uint thứ hai trong mảng động thứ ba, bạn sử dụng x [2] [1] (các chỉ số dựa trên 0 và quyền truy cập hoạt động theo cách ngược lại với khai báo…)

Được rồi, chúng tôi có đủ công cụ cơ bản ở đây để không nguy hiểm, hãy bắt đầu. Hãy thực hiện một số loại ứng dụng xã hội cơ bản, nơi mọi người có thể có một số hình ảnh và một số thông tin cơ bản về bản thân được đăng trong blockchain. Mỗi người dùng sẽ có một địa chỉ ethereum và một “tay cầm” hoặc tên người dùng được liên kết với tài khoản của họ. Chúng tôi sẽ có một số dữ liệu nhân khẩu học cơ bản mà mọi người có thể nhập hoặc không thể nhập và sau đó chúng tôi sẽ có một trang tìm kiếm đơn giản, nơi bạn có thể tra cứu người dùng trong thư mục cơ bản và kiểm tra hình ảnh họ đã thêm / công chứng cho người dùng của họ Hồ sơ.

Dưới đây là hình ảnh về sản phẩm Giao diện người dùng phân cấp ứng dụng (Ðapp) hợp đồng thông minh ethereum Solidity cuối cùng của chúng tôi sẽ trông như thế nào, với người dùng và hình ảnh công chứng được thêm vào:

Cách học tính vững chắc: Hướng dẫn mã hóa Ethereum cơ bản

Tôi đã công chứng cho các bạn một bức ảnh đẹp về bản thân mình cho các bạn và hình ảnh cấu trúc Tinh thể Arsenide Galium từ những ngày còn đi học cho các bạn. Bạn có thể thấy mã băm công chứng SH256 và dấu thời gian cho mỗi hình ảnh và một dấu kiểm nhỏ cho biết rằng dữ liệu hình ảnh được công chứng vẫn khớp với hàm băm công chứng đã được tạo tại dấu thời gian được chỉ định. Vì vậy, tôi sẽ hướng dẫn bạn cách tôi xây dựng ứng dụng này, chỉ ra những mẩu tin thú vị cho bạn, với tất cả các liên kết và ví dụ mã mà bạn có thể cần để tham khảo trong tương lai. Nghe hay đấy? Đi nào!

Điều đầu tiên tôi sẽ làm là thiết lập Truffle “Giường thử nghiệm” sẽ cho phép tôi dễ dàng kiểm tra việc biên dịch hợp đồng thông minh của mình. Biên dịch và triển khai hợp đồng thông minh liên quan đến việc tạo ra các giao dịch đã ký từ lâu, nhưng Truffle sẽ cho phép tôi biên dịch / triển khai và kiểm tra hợp đồng thông minh của mình bằng các lệnh đơn giản. Có rất nhiều công cụ có thể làm điều này, nhưng tôi tình cờ thích video hướng dẫn hợp đồng thông minh Solidity này cái nào sử dụng Truffle dụng cụ. tôi có một demo dự án github thư mục tôi đã tạo chỉ cho hướng dẫn này để mọi người cùng làm theo. Tôi sẽ bắt đầu với một số lệnh thiết lập đơn giản (trong môi trường Linux Debian):

tectract @ blockgeeks / ethereum-demo-tools> npm i -g truffle

# nếu bạn gặp lỗi quyền khi cài đặt mô-đun nút trên toàn cầu, hãy xem tại đây

tectract @ blockgeeks / ethereum-demo-tools> mkdir Geekt # Tôi sẽ gọi ứng dụng xã hội của mình "Geekt"

tectract @ blockgeeks / ethereum-demo-tools> cd Geekt

tectract @ blockgeeks / ethereum-demo-tools / Geekt> truffle init # điều này tạo một vài thư mục và tệp thiết lập, trong thư mục Geekt /

tectract @ blockgeeks / ethereum-demo-tools / Geekt > ls

kiểm tra hợp đồng di chuyển truffle.js # chúng tôi đã tạo ba thư mục và một tệp mới có tên truffle.js

tectract @ blockgeeks / ethereum-demo-tools / Geekt > hợp đồng ls /

ConvertLib.sol MetaCoin.sol Migrations.sol # chúng tôi có một số hợp đồng mẫu cơ bản do Truffle tạo

tectract @ blockgeeks / ethereum-demo-tools / Geekt > ls di cư /

1_initial_migration.js 2_deploy_contracts.js # một vài tệp cho cài đặt biên dịch / di chuyển với Truffle

Ví dụ về hợp đồng thông minh liên kết đơn giản

Được rồi, tôi sẽ tạo một hợp đồng có tên Geekt.sol, trong thư mục / Geekt / Contract đã được tạo khi tôi gọi là ‘truffle init’. Bạn có thể nhìn thấy mã hợp đồng đầy đủ tại đây, và tôi sẽ chỉ ra những điều thú vị nhất ở đây. Ở đầu tệp, chúng tôi có một dòng chỉ định phiên bản trình biên dịch và một số cú pháp định nghĩa hợp đồng cơ bản và định nghĩa biến.

độ rắn pragma ^ 0,4,4;

hợp đồng Geekt {

địa chỉ GeektAdmin;

ánh xạ (byte32 => công chứngImage) công chứngImages; // điều này cho phép tra cứu các hình ảnh được công chứng bằng SHA256notaryHash

bytes32 [] hình ảnhByNotaryHash; // đây giống như một trang trắng của tất cả các hình ảnh, bởi SHA256notaryHash

ánh xạ (địa chỉ => Người dùng) Người dùng; // điều này cho phép tra cứu Người dùng theo địa chỉ ethereum của họ

địa chỉ [] usersByAddress; // đây giống như một trang trắng của tất cả người dùng, theo địa chỉ ethereum

Khi bạn gọi một hàm thay đổi trạng thái trong thế giới thực, bạn sẽ phải chỉ định số ether bạn sẽ trả để thực hiện điều đó, nhưng may mắn là bạn có thể yêu cầu ước tính chi phí về chi phí khí đốt và giá khí đốt ( bằng gas / ether) trước và nó thường rất chính xác. Các thợ đào ethereum sẽ quyết định xem bạn có trả đủ hay không và bao gồm giao dịch thay đổi trạng thái của bạn trong khối tiếp theo, vì vậy bạn thực sự phải đợi các chức năng đó hoạt động trở lại khi khối tiếp theo được tìm thấy. Việc đọc dữ liệu từ các cấu trúc “bộ nhớ” này là miễn phí và bạn cũng không phải đợi khối tiếp theo, các nút sẽ chỉ đọc dữ liệu và trả lại cho bạn ngay lập tức.

Nên Người dùng ánh xạ là đối tượng lưu trữ chính của chúng tôi cho phép chúng tôi tạo các đối tượng Người dùng và tra cứu chúng theo địa chỉ. Bản đồ siêu hiệu quả để lưu trữ và truy xuất dữ liệu nhanh chóng, nhưng không có cách nào dễ dàng để lặp lại bản đồ, vì vậy bạn có thể thấy rằng tôi cũng đã tạo usersByAddress mảng địa chỉ chứa mọi địa chỉ đã biết của người dùng trong hệ thống của chúng tôi, như một trang trắng của tất cả người dùng. Tôi đã tạo ra

Tôi đã tạo ra công chứng ánh xạ để cho phép chúng tôi tạo các đối tượng “hình ảnh” trong bộ nhớ và tra cứu chúng bằng hàm băm SHA256 được liên kết của dữ liệu hình ảnh và các chỉ mục notaryHash đó dài 32 byte.

Chúng tôi cũng có một Hình ảnhByNotaryHash mảng bytes32 là danh sách tất cả các Dấu nháy công chứng, giống như một trang trắng cho phép chúng tôi lặp lại tất cả các hình ảnh đã được công chứng.

cấu trúc công chứngImage {

chuỗi hình ảnhURL;

uint timeStamp;

}

struct Người dùng {

tay cầm chuỗi;

thành phố byte32;

trạng thái byte32;

byte32 quốc gia;

bytes32 [] myImages;

}

Đây (ở trên) là các cấu trúc rất cơ bản và chúng cũng đại diện cho các đối tượng “lưu trữ”, vì vậy chúng tốn ether thực để “tạo” và dữ liệu trong đó thực sự được lưu trữ trong blockchain ethereum và tốn ether thực để thay đổi “trạng thái ”Của các biến nội bộ của chúng. Chúng tôi thực sự chỉ sử dụng các ánh xạ và mảng bên ngoài để theo dõi vị trí trong bộ nhớ blockchain mà các cấu trúc hình ảnh / người dùng này cư trú. Của chúng tôi hình ảnh công chứng struct lưu trữ đơn giản là một URL đến một hình ảnh, có lẽ là ở đâu đó trên web và một dấu thời gian thông báo khi hình ảnh được công chứng. Của chúng tôi Người sử dụng struct lưu trữ một số người dùng cơ bản: xử lý, thành phố, tiểu bang, quốc gia và nó cũng lưu trữ một loạt các hình ảnh mà người dùng này đã công chứng và “thêm” vào tài khoản người dùng của họ, giống như một phiên bản toàn cầu dành cho người dùng nhỏ imagesByNotaryHash đối tượng trang trắng.

hàm registerNewUser (xử lý chuỗi, thành phố byte32, trạng thái byte32, quốc gia byte32) trả về (bool thành công) {

địa chỉ thisNewAddress = msg.sender;

// không ghi đè các mục hiện có và đảm bảo rằng xử lý không rỗng

if (byte (Người dùng [msg.sender] .handle) .length == 0 && byte (xử lý) .length! = 0) {

Người dùng [thisNewAddress] .handle = handle;

Người dùng [thisNewAddress] .city = city;

Người dùng [thisNewAddress] .state = state;

Người dùng [thisNewAddress] .country = country;

usersByAddress.push (thisNewAddress); // thêm một mục nhập cho người dùng này vào ‘whitepages’ của người dùng

trả về true;

} khác {

trả về sai; // hoặc xử lý là null hoặc một người dùng có xử lý này đã tồn tại

}

}

Đây là của chúng tôi registerNewUser chức năng. Nó nhận xử lý, thành phố, tiểu bang, quốc gia làm biến đầu vào và trả về true hoặc false để biểu thị thành công hay thất bại. Tại sao nó sẽ thất bại? Chà, chúng tôi không muốn cho phép người dùng ghi quá mức xử lý của nhau, vì vậy đây sẽ giống như một hệ thống xác nhận quyền sở hữu đầu tiên cho các xử lý. Nếu người dùng có tay cầm này đã tồn tại, chúng tôi trả về null, vì vậy tôi đã đặt dòng điều kiện “nếu” ở đó để kiểm tra điều đó. Chúng tôi cũng không cho phép tạo tên người dùng không có tay cầm. Một điều chúng tôi lưu ý là thisNewAddress đó là trình gọi của hàm, bạn có thể thấy chúng tôi sử dụng msg.sender chức năng lấy dữ liệu đó, đây là địa chỉ mà giao dịch “thực hiện chức năng này” được gửi từ khi ai đó (bất kỳ ai) gọi chức năng hợp đồng thông minh của chúng tôi và họ trả ether thực để thực hiện điều đó. Vì vậy, một đối tượng “ánh xạ” là null theo mặc định và khi chúng ta gọi:

Người dùng [thisNewAddress] .handle = handle;

Điều này tạo ra một đối tượng Người dùng mới, trong ánh xạ Người dùng của chúng tôi và thiết lập xử lý. Tương tự với thành phố, tiểu bang, quốc gia. Xin lưu ý rằng chúng tôi cũng đẩy địa chỉ của Người dùng mới vào đối tượng “trang trắng” của người dùngByAddress Người dùng toàn cầu trước khi chúng tôi trả về true ở đó.

function addImageToUser (string imageURL, bytes32 SHA256notaryHash) trả về (bool thành công) {

địa chỉ thisNewAddress = msg.sender;

if (byte (Users [thisNewAddress] .handle) .length! = 0) {// đảm bảo rằng người dùng này đã tạo tài khoản trước

if (byte (imageURL) .length! = 0) {//) {// không thể làm cho kiểm tra rỗng byte32 hoạt động, rất tốt!

// ngăn người dùng tranh nhau về sha->danh sách hình ảnh trong các trang trắng, nhưng vẫn cho phép họ thêm một tham chiếu cá nhân vào bất kỳ hình ảnh nào

if (byte (công chứngImages [SHA256notaryHash] .imageURL) .length == 0) {

imagesByNotaryHash.push (SHA256notaryHash); // thêm mục nhập cho hình ảnh này vào các trang trắng hình ảnh của chúng tôi

}

công chứngImages [SHA256notaryHash] .imageURL = imageURL;

Công chứngImages [SHA256notaryHash] .timeStamp = block.timestamp; // lưu ý rằng cập nhật hình ảnh cũng cập nhật dấu thời gian

Người dùng [thisNewAddress] .myImages.push (SHA256notaryHash); // thêm băm hình ảnh vào mảng .myImages của người dùng này

trả về true;

} khác {

trả về sai; // imageURL hoặc SHA256notaryHash là rỗng, không thể lưu trữ hình ảnh

}

trả về true;

} khác {

trả về sai; // người dùng chưa có tài khoản, không thể lưu trữ hình ảnh

}

}

Của chúng tôi addImageToUser với chức năng người dùng khá giống với registerNewUser chức năng. Nó trông bạn theo địa chỉ gửi của bạn thông qua đặc biệt msg.sender và kiểm tra xem có một Người dùng đã đăng ký (bằng tay cầm) cho địa chỉ đó trước khi nó cố gắng thêm hình ảnh cho mục nhập người dùng của bạn. Chúng tôi cho phép người dùng thêm notaryHash của họ vào các trang trắng toàn cầu của hình ảnh chỉ khi nó không tồn tại, để ngăn người dùng tranh giành các mục nhập trong các trang trắng toàn cầu, nhưng chúng tôi cho phép họ thêm / cập nhật bất kỳ mục nhập notaryHash nào trong sở hữu các trang trắng nhỏ về hình ảnh của riêng họ. Không có gì với nó!

function getUsers () hằng trả về (address []) {return usersByAddress; }

hàm getUser (địa chỉ userAddress) trả về hằng số (chuỗi, byte32, byte32, byte32, byte32 []) {

return (Users [userAddress] .handle, Users [userAddress] .city, Users [userAddress] .state, Users [userAddress] .country, Users [userAddress] .myImages);

}

function getAllImages () hằng trả về (bytes32 []) {return imagesByNotaryHash; }

function getUserImages (address userAddress) hằng trả về (bytes32 []) {return Users [userAddress] .myImages; }

hàm getImage (bytes32 SHA256notaryHash) trả về hằng số (string, uint) {

trở lại (công chứngImages [SHA256notaryHash] .imageURL, công chứngImages [SHA256notaryHash] .timeStamp);

}

Cuối cùng, các chức năng của trình truy cập (ở trên) cho phép chúng tôi chỉ cần đọc ra từng người dùng hoặc hình ảnh, hoặc lấy danh sách trang trắng đầy đủ của tất cả người dùng hoặc tất cả hình ảnh. Lưu ý các chức năng này trả về không thay đổi dữ liệu, về cơ bản có nghĩa là chúng ở chế độ chỉ đọc, không “thay đổi trạng thái” và chúng có thể tự do gọi và trả lại dữ liệu ngay lập tức, bạn không phải đợi đến khối tiếp theo. Về cơ bản, chúng tôi chỉ gọi vào các ánh xạ / mảng toàn cầu của mình và trả về dữ liệu có liên quan: người dùng theo địa chỉ hoặc hình ảnh bằng notaryHash.

Biên dịch & Thử nghiệm hợp đồng thông minh

Bây giờ chúng tôi muốn thực sự kiểm tra cục bộ hợp đồng thông minh của mình trong môi trường thử nghiệm. Thực sự dễ dàng bằng cách sử dụng các lệnh Truffle đơn giản, nhưng trước tiên, chúng tôi thực sự cần một nút ethereum cục bộ để kiểm tra chống lại. Đó là nơi Ethereum TestRPC TestRPC về cơ bản là một nút giả, một chương trình mỏng chỉ giả vờ là một nút và phản hồi giống như một nút sẽ phản hồi trên máy localhost của bạn. TestRPC chạy trên cổng 8545 giống như một nút ethereum bình thường và nó có khả năng biên dịch hợp đồng thông minh Solidity thành mã EVM và cũng chạy mã đó, ngoài ra bạn sẽ nhận được phản hồi ngay lập tức để kiểm tra, thay vì phải đợi trên mạng ethereum thực để tìm khối tiếp theo. Giờ đây, bạn có thể chạy các lệnh biên dịch / triển khai thử nghiệm Truffle đối với một nút ethereum thực, nhưng điều đó sẽ tốn Ether thực, cộng với việc chạy nút của chính bạn nếu bạn không cần thiết sẽ tốn thời gian và bộ nhớ. Vì vậy, chúng tôi thực hiện một vài lệnh cài đặt nhanh chóng:

npm i -g ethereum-testrpc

testrpc -m “con chó mẫu đến năm phun thu thập thông tin tìm hiểu chung về phi công phát hiện thạch bạc”

Điều này khởi động TestRPC với một cụm từ “hạt giống” được chỉ định và bạn sẽ thấy một cái gì đó như thế này như là đầu ra:

EthereumJS TestRPC v3.0.5

Tài khoản có sẵn

==================

(0) 0x0ac21f1a6fe22241ccd3af85477e5358ac5847c2

(1) 0xb0a36610de0912f2ee794d7f326acc4b3d4bc7bc

(9) 0x4c1cc45ef231158947639c1eabec5c5cb187401c

Chìa khóa riêng

==================

(0) 91e639bd434790e1d4dc4dca95311375007617df501e8c9c250e6a001689f2c7

(1) afaeff0fc68439c4057b09ef1807aaf4e695294db57bd631ce0ddd2e8332eea7

(9) dcc51540372fa2cf808efd322c5e158ad5b0dbf330a809c79b540f553c6243d7

Ví HD

==================

Ghi nhớ: mẫu chó đến năm phun thu thập thông tin tìm hiểu chung về phi công phát hiện thạch bạc

Đường dẫn HD cơ bản: m / 44 ‘/ 60’ / 0 ‘/ 0 / {account_index}

Đang nghe trên localhost: 8545

Bạn sẽ thấy một số hoạt động ở đây trong cửa sổ này khi TestRPC đang chạy, khi bạn triển khai và tương tác với hợp đồng thông minh của mình qua Truffle hoặc Web3.js. Được rồi, chúng tôi đã sẵn sàng để triển khai thử nghiệm. Bạn sẽ cần sửa đổi tệp /migrations/2_deploy_contracts.js bao gồm tên của hợp đồng thông minh của bạn, để truffle biết để biên dịch và triển khai nó. Chúng tôi thực hiện lệnh này:

biên dịch truffle

Nếu mọi việc suôn sẻ, bạn sẽ thấy một thông báo cho biết đó là “lưu phần mềm” và không có thông báo lỗi. Tôi sẽ không nói dối, nếu hợp đồng của bạn có lỗi cú pháp hoặc các vấn đề khác, thông báo lỗi trình biên dịch mà bạn thấy có thể sẽ rất bí ẩn và khó giải thích! Nếu bạn gặp lỗi về “kích thước ngăn xếp”, điều đó có thể có nghĩa là bạn có quá nhiều biến được chuyển vào / ra từ một lệnh gọi hàm, một quy tắc tốt cần nhớ là 16 biến đầu vào hoặc đầu ra là giá trị tối đa, nói chung. Ngoài ra, hãy nhớ rằng hợp đồng thông minh Solidity không thể trả về các loại dữ liệu cấu trúc tùy chỉnh, vì vậy bạn cũng sẽ phải giải quyết vấn đề đó, thông thường tôi chỉ trả về mảng và con trỏ / địa chỉ của các cấu trúc khác trong ánh xạ nội bộ của mình. Nếu bạn nhận được thời gian chạy thông báo lỗi về “ngăn xếp”, điều đó có thể có nghĩa là bạn có điều kiện không hợp lệ trong mã của mình.

truffle di cư

Lệnh này (ở trên) thực sự triển khai thử nghiệm hợp đồng thông minh của bạn trên nút TestRPC của bạn. Tôi thấy kết quả đầu ra này trả về:

Đang chạy quá trình di chuyển: 1_initial_migration.js

Triển khai di chuyển…

Di chuyển: 0xd06a1935230c5bae8c7ecf75fbf4f17a04564ed8

Lưu di chuyển thành công sang mạng…

Lưu hiện vật…

Đang chạy di chuyển: 2_deploy_contracts.js

Triển khai Geekt…

Geekt: 0xe70ff0fa937a25d5dd4172318fa1593baba5a027

Lưu di chuyển thành công sang mạng…

Lưu hiện vật..

Hợp đồng thông minh của chúng tôi (có tên là “Geekt”) được cấp một địa chỉ trên chuỗi khối Ethereum khi nó triển khai thành công, bạn có thể xem ở trên, địa chỉ là 0xe70ff0fa937a25d5dd4172318fa1593baba5a027. Trên mạng ethereum thực, trực tiếp, bạn trả tiền gas để triển khai hợp đồng của mình và địa chỉ không bao giờ thay đổi. Trên TestRPC, nếu bạn tắt TestRPC, nó sẽ quên mọi thứ và khi bạn bắt đầu sao lưu lại TestRPC, bạn sẽ phải triển khai lại hợp đồng của mình và bạn sẽ nhận được một địa chỉ khác cho hợp đồng thông minh của mình. Địa chỉ của hợp đồng thông minh của bạn là nơi mọi người có thể gửi các giao dịch bằng tin nhắn để tương tác với nó, để thực hiện các giao dịch thay đổi trạng thái hoặc chỉ đọc dữ liệu từ blockchain ethereum. Hợp đồng thông minh cũng có thể tương tác trực tiếp với nhau qua các địa chỉ này, sử dụng “tin nhắn”. Các hợp đồng thông minh tương tác với các hợp đồng thông minh khác để lưu trữ, thay đổi hoặc đọc dữ liệu thông qua các “thông điệp” blockchain ethereum này được gọi là Các tổ chức tự trị phi tập trung, hoặc của DAO.

Ok, bây giờ đến phần thú vị. Chúng tôi đã sẵn sàng thực hiện một số thử nghiệm ban đầu và tương tác với hợp đồng thông minh của chúng tôi. Chúng tôi khởi động “bảng điều khiển” Truffle và thực hiện một số truy vấn đối với nút máy chủ cục bộ TestRPC của chúng tôi, để đảm bảo mọi thứ đang hoạt động và chúng tôi có thể thêm người dùng và hình ảnh và truy xuất chúng đúng cách.

bảng điều khiển truffle

> Geekt = Geekt.deployed ()

> Geekt.then (function (instance) {return JSON.stringify (instance.abi);})

> Geekt.then (function (instance) {return instance.registerNewUser ("Rút gọn","Denver","CO","Hoa Kỳ");})

> Geekt.then (function (instance) {return instance.addImageToUser (‘www.myimageURL.com’, ‘0x6c3e007e281f6948b37c511a11e43c8026d2a16a8a45fed4e83379b66b0ab927’);})

> Geekt.then (function (instance) {return instance.getUser (‘0x0ac21f1a6fe22241ccd3af85477e5358ac5847c2’);}) > Geekt.then (function (instance) {return instance.getUsers ();})

> Geekt.then (function (instance) {return instance.getImages ();})

> Geekt.then (function (instance) {return instance.getImage (‘0x6c3e007e281f6948b37c511a11e43c8026d2a16a8a45fed4e83379b66b0ab927’);})

Một khái niệm quan trọng ở đây là ABI, là một đối tượng có định dạng javascript mô tả tên hàm và đầu vào / đầu ra để tương tác với hợp đồng thông minh của bạn, nó giống như mô tả Giao diện lập trình viên ứng dụng (API) cho hợp đồng thông minh của bạn, cho mọi người biết cách tạo thông điệp cho nó. Hàm registerNewUser () của tôi đang hoạt động! Tôi thấy điều này phản hồi lại lệnh gọi hàm registerNewUser (), trong cửa sổ bảng điều khiển:

{tx: ‘0x1b9f55971871921ccd23a9aa7620620c6c958a893af334087283926d4c6d60b1’,

biên lai:

{transactionHash: ‘0x1b9f55971871921ccd23a9aa7620620c6c958a893af334087283926d4c6d60b1’,

transactionIndex: 0,

blockHash: ‘0x2be4fab68daaf8db199e2a6adea101c0f1ed06f46aba21e8e4c06e752ca3325c’,

blockNumber: 5,

gas đã sử dụng: 145215,

tích lũyGasUsed: 145215,

hợp đồngAddress: null,

nhật ký: []},

nhật ký: []}

Hàm AddImageToUser () trả về thành công tương tự và khi bây giờ tôi có thể truy xuất bản ghi người dùng cá nhân hoặc bản ghi hình ảnh được công chứng từ blockchain ethereum. Lời gọi hàm getUser () của tôi trả về:

[‘Rút gọn’,

‘0x44656e7665720000000000000000000000000000000000000000000000000000’,

‘0x434f000000000000000000000000000000000000000000000000000000000000’,

‘0x5553410000000000000000000000000000000000000000000000000000000000’,

[‘0x6c3e007e281f6948b37c511a11e43c8026d2a16a8a45fed4e83379b66b0ab927’]]

và tôi có thể lấy dữ liệu hình ảnh đó thông qua chuỗi băm 32 byte SHA256Notary mà tôi đã liên kết với nó, hàm getImage () của tôi trả về:

[‘www.myimageURL.com’,

{[Chuỗi: ‘1496256315’] s: 1, e: 9, c: [1496256315]}]

Tất cả điều này trông tuyệt vời. Mọi thứ đang hoạt động, được thử nghiệm trong TestRPC và Truffle và chúng tôi đã sẵn sàng thực sự xây dựng một giao diện người dùng đồ họa tuyệt vời cho Ứng dụng của chúng tôi để thế giới có thể tương tác với đăng ký người dùng và công chứng hình ảnh của chúng tôi trên blockchain ethereum.

Thiết kế ứng dụng Ethereum cơ bản

Thiết kế Localhost & Thử nghiệm

Chúng tôi đã sẵn sàng bắt đầu, hợp đồng thông minh bằng ngôn ngữ Solidity của chúng tôi đã được biên dịch thành công và được triển khai cho nút ethereum testRPC địa phương của chúng tôi. Giờ đây, chúng tôi có thể nhanh chóng xây dựng một ÐApp đơn giản có thể cho phép người dùng tương tác với hợp đồng thông minh thông qua trình duyệt web của họ, sử dụng một số lập trình web cơ bản và đặc biệt Web3.js mô-đun javascript, được tạo đặc biệt để tương tác với các nút Ethereum và hợp đồng thông minh qua web.

Tôi đã làm bản demo này (kho github mã nguồn mở) làm tài liệu tham khảo cho mọi người sử dụng khi xây dựng Ethereum ÐApps bằng web3.js, Bản trình diễn này được thực hiện bằng một công cụ dễ sử dụng có tên Tạo-phản ứng-ứng dụng, nó sử dụng React ngôn ngữ web nội bộ của Facebook, nhưng chúng tôi sẽ không tập trung vào bất kỳ mã React nào, chỉ tập trung vào các lệnh javascript web.js cần thiết. Mã của tôi bằng CommonJS, nó gần giống hệt với javascript ES6 cũ kỹ.

Vì vậy, trong ứng dụng web của bạn, bạn cài đặt mô-đun nút web3 thông qua một lệnh như “npm i -S web3” và nó sẽ lưu vào tệp package.json của bạn, nếu bạn đang sử dụng. Vì vậy, bạn sẽ có, bên trong thẻ “” hoặc bên trong tệp .js, một dòng như thế này để tải chính mô-đun web3:

nhập Web3 từ ‘web3’;

(hoặc, trong javascript ES6)

var Web3 = request (‘web3’);

Chúng tôi phải cho Web3 biết một số chi tiết về nút và hợp đồng thông minh của chúng tôi, để nó có thể kết nối. Bạn sẽ thấy những dòng như thế này:

# dòng này đặc tả IP nút localhost: cài đặt cổng của chúng tôi

var web3 = new Web3 (Web3.providers mới.HttpProvider ("http: // localhost: 8545"));

# địa chỉ hợp đồng thông minh của chúng tôi, từ phía trên

var GeektAddress = ‘0xe70ff0fa937a25d5dd4172318fa1593baba5a027’;

# ABI hợp đồng thông minh của chúng tôi, dưới dạng đối tượng javascript thô, không phải chuỗi được trích dẫn!

var GeektABI = [{"không thay đổi":thật,"đầu vào": [],"Tên":"getUsers","đầu ra": [{"Tên":"", (…)

# điều này tải hợp đồng thông minh vào đối tượng web3 của chúng tôi

GeektContract = web3.eth.contract (GeektABI) .at (GeektAddress);

# this tìm tài khoản mặc định được liệt kê cho kết nối nút (tài khoản 0 từ TestRPC ở trên)

defaultAccount = web3.eth.accounts [0];

Dưới đây là một số dòng chứng minh các chức năng chỉ đọc giao tiếp với hợp đồng thông minh của chúng tôi, thông qua web3:

# chức năng dưới đây được kích hoạt khi trang tải, để có được "trang trắng" của tất cả các địa chỉ người dùng đã biết

GeektContract.getUsers (function (err, usersResult) {

# hàm bên dưới lấy một hình ảnh khi cần và lưu chúng vào bộ nhớ trình duyệt…

GeektContract.getImage (imageHash, function (err, imageResult) {

Bản demo đơn giản này ÐApp chỉ tải tất cả các địa chỉ người dùng đã biết và lấy chi tiết hình ảnh người dùng thực tế và hình ảnh tự ghi lại khi cần thiết khi đang di chuyển. Đây là ảnh chụp màn hình:

Cách học tính vững chắc: Hướng dẫn mã hóa Ethereum cơ bản

Tại thời điểm này (hình ảnh ở trên) Tôi đã làm mới ứng dụng khách TestRPC của mình và vừa thực hiện lệnh “truffle migrate” triển khai hợp đồng thông minh dựa trên nút TestRPC trên máy chủ cục bộ của tôi. Bạn có thể thấy giao diện đã sẵn sàng để tôi nhấp vào nút và “đăng ký” người dùng đầu tiên. Khi tôi nhấp vào nút này, hàm registerNewUser () từ hợp đồng thông minh của tôi sẽ được gọi, thêm dữ liệu người dùng này vào nút blockchain ethereum (thử nghiệm localhost) của tôi tại địa chỉ hợp đồng thông minh mà chúng tôi đã lưu ý ở trên. Việc thêm dữ liệu người dùng vào “kho lưu trữ” của blockchain sẽ tốn xăng và chúng ta cần tính xem mình phải trả bao nhiêu xăng, thay vì chỉ dựa vào một phỏng đoán khoa học (SWAG). Đây là mã thực sự được gọi khi nhấp vào nút “Ký vào sổ lưu bút” này:

GeektContract.registerNewUser.estimateGas (

ngoàiThis.state.defaultHandle,

ngoàiThis.state.defaultCity,

ngoàiThis.state.defaultState,

ngoàiThis.state.defaultCountry,

{from: defaultAccount},

function (err, result) {

var myGasNum = result;

GeektContract.registerNewUser.sendTransaction (

ngoàiThis.state.defaultHandle,

ngoàiThis.state.defaultCity,

ngoàiThis.state.defaultState,

ngoàiThis.state.defaultCountry,

{from: defaultAccount, gas: myGasNum},

function (err, result) {

Vì vậy, bạn có thể thấy, khi chúng tôi thực hiện một giao dịch thay đổi trạng thái mà chúng tôi thực sự phải trả bằng khí ethereum (khí thực hoặc testnet), chúng tôi sẽ gọi đây là registerNewUser.estimateGas () chức năng trước, và sau đó sử dụng lượng khí ước tính đó khi chúng ta gọi hàm thay đổi trạng thái là thực, sử dụng registerNewUser.sendTransaction () chức năng.

Khi chúng tôi bắt đầu TestRPC và nó đưa ra một số địa chỉ ví thử nghiệm cho chúng tôi, những tài khoản này giống với tài khoản bạn sẽ có nếu bạn chạy một nút đầy đủ và thực hiện lệnh getAccounts RPC đối với nó, giống như một ví đầy đủ nút. TestRPC cung cấp cho bạn một số đồng tiền testnet miễn phí, 100 Ether testnet cho mỗi tài khoản khi nó khởi động.

Khi chúng ta gọi các hàm thay đổi trạng thái này như registerNewUser () hoặc là addImageToUser (), trong giai đoạn kiểm tra localhost, đối với nút TestRPC của chúng tôi, TestRPC chỉ thanh toán testnet gas cho bạn và trả về kết quả của giao dịch ngay lập tức. Trên một nút localhost đầy đủ, bạn sẽ phải “mở khóa” tài khoản đó trước khi giao dịch thành công trên mạng chính và bạn sẽ phải đợi trên mạng chính để khối tiếp theo thực hiện giao dịch của bạn, giả sử rằng ước tính gas của chúng tôi là đủ! Nhưng luôn có một cách tốt hơn, các bạn của tôi &# x1f642;

Kết nối Ðapp của bạn với Mainnet

Tôi đã thiết lập và triển khai hợp đồng thông minh trên Ethereum Mainnet và ứng dụng demo này trên một trong các máy chủ web của tôi, tại www.enledger.io/etherereum-demo-tools. Nếu bạn truy cập trang web này và bạn không có TestRPC hoặc nút ethereum đầy đủ đang chạy trên localhost: 8545 và bạn truy cập trang web này, bạn có thể sẽ thấy một cái gì đó như sau:

Thấy kết nối với mạng: !

Đã thấy tài khoản mặc định: (không có liên kết nút web3.eth)

Vì vậy, điều này có nghĩa là bạn cần một nút ethereum đầy đủ đang chạy hoặc một nút đầy đủ của Máy chủ riêng ảo (VPS) để kết nối, để tương tác với Mainnet ethereum? Cho đến gần đây điều đó là đúng, nhưng bây giờ chúng tôi có plugin chrome tuyệt vời này có tên là Metamask (dành cho trình duyệt Chrome), cho phép bạn kết nối với ethereum Mainnet trong trình duyệt của mình và về cơ bản các Metamask cung cấp kết nối tới một nút đầy đủ cho bạn , ngay tại đó, miễn phí, vì vậy đạo cụ cho họ!

Bạn có thể thấy trong mã của mình, tôi phát hiện thấy đối tượng web3 “được tiêm” đặc biệt từ plugin metamask thiết lập kết nối nút với nút đầy đủ ethereum của chúng. Đây là mã có liên quan tự động chuyển sang máy khách thông thường (máy chủ cục bộ) hoặc kết nối web3 của metamask:

hàm loadWeb3 () {

let web3Injected = window.web3;

if (typeof web3Injected! == ‘undefined’) {

console.log ("đã thấy web3 được đưa vào!");

web3 = new Web3 (web3Injected.currentProvider);

} khác {

console.log ("không thấy web3 được đưa vào!");

web3 = new Web3 (Web3.providers mới.HttpProvider ("http: // localhost: 8545"));

}

}

Trong hình ảnh bên dưới, lưu ý biểu trưng Metamask Fox ở góc trên bên phải, tôi đã cài đặt Plugin Metamask và kết nối với ethereum Mainnet trong trình duyệt của mình! Bạn có thể thấy rằng tôi đã thêm một vài người dùng vào sổ lưu bút trong hợp đồng thông minh demo Guestbook “Geekt” của chúng tôi. Giao diện ÐApp cho phép bạn chọn người dùng và duyệt qua hình ảnh của họ, và bạn sẽ thấy trang Đăng nhật ký nếu bạn kết nối từ một địa chỉ chưa đăng ký người dùng.

Tôi đã thêm một số mã để bạn có thể chỉ cần dán vào URL của hình ảnh mà bạn muốn thêm vào tài khoản người dùng của mình và nó sẽ tìm nạp hàm băm công chứng SHA256 để bạn thêm vào hình ảnh và nó cũng sẽ kiểm tra hàm băm công chứng SHA256 của hình ảnh khi chúng được tải vào trang và cung cấp cho bạn một dấu kiểm nhỏ màu xanh lục hoặc dấu ‘X’ màu đỏ dựa trên việc hình ảnh tại URL đó và mã băm công chứng có còn khớp nhau hay không. Tôi đang thêm hình ảnh biểu trưng “BlockGeeks” trong tài khoản người dùng Ryan M. của mình tại đây và tôi đã nhấp vào nút để thêm hình ảnh cho người dùng này.

Plugin Metamask đã phát hiện ra rằng tôi cần thanh toán cho giao dịch ethereum web3 này bằng khí Ethereum thực và nó đã xuất hiện một cửa sổ nhỏ để nhắc tôi liệu tôi có chấp nhận giao dịch này hay không. Tôi đã gửi một ít Ether thực đến ví Metamask này và nó đủ để xóa giao dịch, vì vậy tôi nhấp vào ‘chấp nhận’.

Cách học tính vững chắc: Hướng dẫn mã hóa Ethereum cơ bản

Những suy nghĩ cuối cùng, những suy ngẫm sâu sắc

Đó là nó, nó đang hoạt động! Bài viết demo và kho lưu trữ mã này sẽ giúp bạn rất nhiều trong việc trở thành một nhà phát triển Ứng dụng và Ngôn ngữ rắn Ethereum tuyệt vời! Bạn có thể cài đặt Plugin Metamask, kết nối với Ethereum Mainnet và truy cập www.enledger.io/etherereum-demo-tools và bạn sẽ thấy ứng dụng Lưu bút / Bản trình diễn công chứng của tôi cũng như những người dùng và hình ảnh tương tự này và bạn thậm chí có thể ký vào sổ lưu bút và công chứng hình ảnh, nếu bạn muốn &# x1f642;

Để các bạn không quá mất kiểm soát với điều này, tôi đã thêm một chút khả năng kiểm duyệt cho “chủ sở hữu” hợp đồng thông minh, mà tôi đã đặt nội bộ thành địa chỉ của bất kỳ ai ban đầu trả tiền để triển khai hợp đồng thông minh- hợp đồng với mạng chính, đó là tôi. Tôi muốn nhanh chóng cho bạn thấy cách hoạt động của khả năng quản trị viên đặc biệt đó vì bạn thấy loại mã người dùng quản trị viên này khá phổ biến:

địa chỉ GeektAdmin;

function Geekt () Payment {// đây là CON HẠNG VIÊN (cùng tên với hợp đồng) nó chỉ được gọi MỘT LẦN khi hợp đồng được triển khai lần đầu tiên

GeektAdmin = msg.sender; // chỉ cần đặt quản trị viên để họ có thể xóa người dùng hoặc hình ảnh xấu nếu cần, nhưng không ai khác có thể

}

chỉ bổ trợAdmin () {

if (msg.sender! = GeektAdmin)

phi;

// Đừng quên "_;"! Nó sẽ được thay thế bởi phần thân hàm thực khi công cụ sửa đổi được sử dụng.

_;

}

function removeUser (address badUser) onlyAdmin trả về (bool thành công) {

xóa Người dùng [badUser];

trả về true;

}

function removeImage (bytes32 badImage) onlyAdmin trả về (bool thành công) {

xóa hình ảnh công chứng [badImage];

trả về true;

}

Chúng tôi có một hàm tạo đặc biệt, Geekt (), có cùng tên với chính hợp đồng, chỉ được gọi một lần khi hợp đồng được triển khai lần đầu tiên vào blockchain. Chức năng này đặt người dùng quản trị đến địa chỉ của msg.sender, người đã trả tiền để triển khai hợp đồng thông minh. Chúng tôi cũng có một hàm sửa đổi chỉAdmin () đặc biệt sau đó được áp dụng cho các hàm removeUser () và removeImage () của chúng tôi, để hạn chế các hàm đó để chúng chỉ có thể được kích hoạt nếu địa chỉ msg.sender là địa chỉ người dùng quản trị.

Bây giờ tôi có một cách để loại bỏ tất cả những kẻ xấu, nếu cần &# x1f642; Đừng bắt tôi làm điều đó!

Một điểm cuối cùng mà tôi muốn đề cập là chúng tôi chỉ mới thực sự làm xước bề mặt ở đây. Một loại tính năng cơ bản mà tôi không đề cập đến là “sự kiện” Solidity, đây là một cách để bạn đẩy các bản cập nhật trở lại trình duyệt, giống như một kết nối “ổ cắm” xem và kích hoạt các sự kiện trình duyệt khi một người dùng đăng ký mới hoặc hình ảnh được phát hiện. Các phần thực sự thú vị nhất của ethereum và Solidity đến từ các hợp đồng thông minh tương tác với Oracles và các hợp đồng thông minh nói chuyện và hành động với nhau bằng cách sử dụng “tin nhắn” (DAO’s). Ngoài ra còn có một số

Các phần thực sự thú vị nhất của ethereum và Solidity đến từ các hợp đồng thông minh tương tác với Oracles và các hợp đồng thông minh nói chuyện và hành động với nhau bằng cách sử dụng “tin nhắn” (DAO’s). Ngoài ra còn có một số Khá nghiêm trọng những cân nhắc về bảo mật mà bạn nên tìm hiểu, trước khi bạn cố gắng lưu trữ ethereum thực trong hợp đồng thông minh của mình và gửi nó cho mọi người dựa trên các lệnh gọi chức năng, một loạt người đã mất khoảng M đô la cho cái đó và kết quả là nó đã chia tách mạng ethereum trong một hard-fork gây tranh cãi. Đó là điều bạn thực sự nên để ý và có lẽ tôi nên đề cập vấn đề đó trong một bài viết khác, tất nhiên &# x1f642; Bài viết này sẽ rất hay để giúp bạn đi tiếp và “nguy hiểm” như tôi đã nói và tôi khuyến khích bạn tìm hiểu nó, thậm chí được một số công ty tử tế trả tiền cho bạn để học nó nếu bạn có thể, nhưng con đường này vẫn còn nhiều điều nữa.

Một điểm khác, điểm cuối cùng tôi muốn nói đến là cấu trúc của ethereum và chi phí thực của việc sử dụng hợp đồng thông minh, ngay bây giờ. ethereum là một mạng chạy trên một blockchain công khai, lớn, nơi mọi người đều có thể trả tiền để truy cập và lưu trữ dữ liệu trong đó. Tuy nhiên, thực sự đang làm điều đó hơi tốn kém. Bạn có thể thấy ở trên trong hình ảnh của tôi, tôi đã bị tính phí 0,004182 Ether, ngày nay tương đương với 0,96 đô la Mỹ thực, để lưu trữ URL hình ảnh, hàm băm công chứng SHA256 và dấu thời gian, bao gồm 196 byte, cho Ethereum Mainnet. Điều này tính ra chi phí lưu trữ dữ liệu là $ 5,159,03 mỗi MB!

Đó là nghĩa đen điên cuồng đắt. Ý tưởng ban đầu về chi phí gas được mô tả trong ethereum Whitepaper nói rằng chi phí gas được cho là lý tưởng nhất là không đổi, tuy nhiên chi phí gas được gắn với số khối, trong quá trình triển khai thực tế và số khối không tăng nhanh như hiện tại giá thị trường của ethereum, do đó, gas ngày càng đắt hơn trong điều kiện thực. Ngoài ra, tình huống hard-fork cho thấy rằng đây thực sự là một chuỗi công khai và nếu điều gì đó thực sự gây tranh cãi xảy ra trên đó, nó có thể bị fork và dữ liệu của bạn về mặt lý thuyết có thể bị rollback hoặc loại tài sản cơ bản có thể giảm giá mạnh. Chi phí tuyệt đối cho dữ liệu và đại dương dữ liệu ngoài kia đang chờ được lưu trữ có nghĩa là lượng dữ liệu lưu trữ trong bất kỳ chuỗi nào có thể cần được giới hạn hoặc có thể tự giới hạn.

ethereum có thể phù hợp nhất cho những thứ chỉ cần một lượng nhỏ lưu trữ dữ liệu công khai trên chuỗi, chẳng hạn như có thể là một hệ thống danh tiếng trực tuyến hoặc một dự án công chứng dữ liệu. Ví dụ: có thể không hợp lý khi xây dựng một dự án blockchain để đưa tất cả dữ liệu ngành công nghiệp phụ tùng của Hoa Kỳ vào chuỗi khối ethereum, bởi vì bạn có thể không muốn tất cả thông tin đó được công bố công khai và bạn cần giảm các khoản phí giao dịch đó cho cách sử dụng widget-ngành cụ thể. Bạn có thể cân nhắc rằng mô hình blockchain bằng chứng cổ phần có thể tiết kiệm năng lượng hơn, ngay cả khi điều đó có thể đại diện cho sự suy yếu về lý thuyết của mô hình bảo mật đồng thuận so với bằng chứng cổ phần của Nakamoto cho dự án blockchain của bạn.

Tôi khuyên bạn rằng trước khi bắt tay vào một dự án blockchain mới, hãy xem xét cẩn thận nền tảng bạn muốn sử dụng, xem xét những thứ mới nhất ngoài kia và đừng ngại khám phá, đồng thời cũng xem xét cẩn thận khuyến khích nút điều đó sẽ thu hút mọi người tải xuống mã nút thú vị của bạn và chạy nó! Lời khen tốt nhất mà một lập trình viên có thể nhận được chỉ đơn giản là mọi người sử dụng mã của họ trong thế giới thực và làm việc hiệu quả với nó.

Phần tiền thưởng điên rồ bí mật

Triển khai cho tôi tới Mainnet, Thuyền trưởng

Tôi đã trở lại, với nhiều thứ tuyệt vời hơn dành cho bạn và cộng đồng ethereum! Vì vậy, tôi đã bỏ qua một chi tiết quan trọng ở trên, bạn có thể nhận thấy. Sau khi bạn viết hợp đồng thông minh của mình, hãy kiểm tra biên dịch nó hàng nghìn lần cho đến khi nó hoạt động, triển khai, kiểm tra localhost tất cả đều hoạt động. Bây giờ, làm thế nào Địa ngục bạn có đưa thứ này lên Mainnet không !? Đó là loại

Việc này khá khó và thường liên quan đến việc phải chạy nút ethereum đầy đủ của riêng bạn hoặc trả tiền cho ai đó để chạy một nút cho bạn và cho phép bạn truy cập nó (như thông qua VPS). Vì vậy, điều đó thực sự bất tiện cho tôi, bởi vì tôi thiếu kiên nhẫn và tôi đang viết bài này trong thời hạn chót, mọi người! Tôi không có thời gian để đợi nút đầy đủ ethereum mới của mình đồng bộ hóa và tôi không cảm thấy muốn phá hủy vài trăm hợp đồng dung lượng ổ cứng và một trong những hộp của mình để sử dụng ethereum tx toàn thời gian, và tôi Tôi cũng quá rẻ để trả cho một VPS để làm điều đó cho tôi, lol.

Vì vậy, tôi đã sử dụng một số kung-fu web javascript đặc biệt và chỉ cần tìm ra cách tôi có thể tạo một trang web với một hộp và một nút, nơi bạn có thể dán hợp đồng của mình, nhấp vào nút và triển khai hợp đồng thông minh Solidity trực tiếp để Mainnet, thông qua Plugin Metamask. Chủ yếu tôi làm điều này chỉ vì sự thuận tiện, để viết bài này, nhưng nó lại là một công cụ hữu ích đáng ngạc nhiên, vì vậy tôi đã đưa nó lên web cho mọi người sử dụng. Lần đầu tiên, bạn có thể thực hiện tất cả các thử nghiệm của mình và thậm chí là triển khai hợp đồng thông minh đầy đủ cho Mạng chính ethereum mà không cần một nút ethereum đầy đủ của riêng bạn! Hãy để tôi giới thiệu EthDeployer công cụ này là phần mềm miễn phí dành cho các bạn vì phần mềm miễn phí mang lại cho chúng ta sự tự do &# x1f642;

Đây là một liên kết đến EthDeployer Repo trên Github, và bạn cũng có thể chỉ cần truy cập vào hoạt động trực tiếp của tôi Tectract’s EthDeployer và triển khai các hợp đồng của bạn trực tiếp từ đó, bạn chỉ cần cài đặt Plugin Metamask và kết nối với Ethereum Mainnet trước tiên, ngoài ra, bạn sẽ cần một ít Ether trong ví Metamask của mình để thanh toán phí triển khai hợp đồng thông minh Mainnet, tất nhiên!

Công cụ này sử dụng Browser-Solc công cụ, chỉ là một công cụ trình tải đã được duyệt, được rút gọn để tải lên phiên bản javascript của Solidity Compiler, trực tiếp vào trình duyệt phía máy khách, để phân tích / biên dịch hợp đồng thông minh một cách nhanh chóng. Điều này làm cho công cụ hoàn toàn độc lập và di động, có nghĩa là bạn không cần phải lo lắng về việc cài đặt trình biên dịch Solc trên máy tính của mình và tôi cũng không cần lo lắng về việc cài đặt nó trên máy chủ của mình, điều này rất tuyệt vời cho mọi người. Hãy để tôi chỉ ra mã tải trình biên dịch solidity mới nhất có sẵn:

Tôi có javascript trình duyệt thu gọn-solc.min.js đang tải qua trang index.html cấp cao nhất, điều này tạo ra window.BrowserSolc đối tượng có sẵn cho các kịch bản phản ứng cấp thấp hơn của tôi. Đây là một ứng dụng tạo-phản ứng rất đơn giản khác có thể được cài đặt và triển khai trong vài phút trên máy của bạn, tôi thậm chí còn cung cấp một readme.md thực sự hữu ích trong github repo chỉ cho bạn cách thực hiện điều đó.

setupCompiler () {

var ngoàiThis = this;

setTimeout (function () {

// console.debug (window.BrowserSolc);

window.BrowserSolc.getVersions (hàm (soljsonSources, soljsonReleases) {

var compilerVersion = soljsonReleases [_. các khóa (soljsonReleases) [0]];

console.log ("Phiên bản trình biên dịch Browser-solc: " + compilerVersion);

window.BrowserSolc.loadVersion (compilerVersion, function (c) {

trình biên dịch = c;

ngoàiThis.setState ({statusMessage:"Sẵn sàng!"},chức năng(){

console.log ("Phiên bản Solc đã tải: " + compilerVersion);

});

});

});

}, 1000);

}

Hàm setupCompiler đợi một giây để đối tượng window.BrowserSolc khả dụng sau khi tải trang, sau đó là hàm .getVersions () và .loadVersion () nội bộ, thực sự không có nhiều thứ và chúng ta có một trình biên dịch Solc chức năng có sẵn cho chúng tôi trực tiếp trong một môi trường hoàn toàn phía khách hàng, tốt đẹp! Để đầy đủ, tôi sẽ hiển thị một số dòng có liên quan thực sự xử lý việc biên dịch và triển khai hợp đồng từ bên trong hàm javascript, khi “biên dịch & triển khai! ” nút được nhấn:

compileAndDeploy () {

var result = compiler.compile (this.state.contractText, tối ưu hóa);

var abi = JSON.parse (result.contracts [_. key (result.contracts) [0]]. interface);

var bytecode = "0x" + result.contracts [_. các khóa (result.contracts) [0]]. bytecode;

var myContract = web3.eth.contract (abi);

web3.eth.estimateGas ({data: bytecode}, function (err, gasEstim) {

myContract.new ({from: web3.eth.accounts [0], data: bytecode, gas: InflatedGasCost}, function (err, newContract) {

thisTxHash: newContract.transactionHash,

thisAddress: newContract.address

Chúng tôi có tất cả các đồ vật quen thuộc từ trước, chúng tôi gọi compiler.compile () trên văn bản hợp đồng và nhận đối tượng “kết quả” hợp đồng đã biên dịch mà từ đó chúng tôi trích xuất abi và mã bytecode, và gửi nó đi trong một giao dịch mới. Chúng tôi thấy hàm .estimateGas () quen thuộc cũ của chúng tôi cũng được đưa vào đây để có biện pháp tốt. Chúng tôi lấy ID giao dịch và địa chỉ hợp đồng mới để hiển thị lại cho người dùng khi hợp đồng được triển khai thành công. Bam, xong rồi! Hãy xem nó hoạt động:

“Ồ đúng vậy, nếu bạn nhận được thông báo lỗi khi triển khai, hãy đảm bảo thực sự kiểm tra liên kết ID giao dịch, hợp đồng rất có thể DID thực sự triển khai thành công, đôi khi Metamask chỉ không nhận được trạng thái giao dịch thành công khi triển khai và địa chỉ hợp đồng mới và quay trở lại vào môi trường trình duyệt của chúng tôi một cách thành công. “

Cách học tính vững chắc: Hướng dẫn mã hóa Ethereum cơ bản

Nó vẫn còn sống. Nó làm tôi vô cùng hạnh phúc! Đã mở khóa tiền thưởng bổ sung bí mật! Vì vậy, tôi đã trả 0,02268 Ether bằng gas, khoảng $ 5,30 USD (ngày 1 tháng 6 năm 2017), để triển khai hợp đồng này trên ethereum Mainnet. Hãy nhớ rằng đây được cho là một ứng dụng demo siêu đơn giản, chỉ với hai cấu trúc dữ liệu khả thi. Nó chỉ giống như $ 2 một vài tuần trước, điều này thật hoang đường! Nhưng vẫn phải chăng, bạn không thực sự cần phải triển khai hợp đồng của mình cho chuỗi chính mà thường xuyên, chỉ một lần nên thực hiện.

Đó là tất cả những gì tôi có cho bạn lần này, các bạn! Hy vọng bạn thấy hướng dẫn này cực kỳ hữu ích và bạn có thể sử dụng tốt công cụ EthDeployer trong các cuộc phiêu lưu dành cho nhà phát triển của bạn ngoài kia. Tôi mong muốn được nghe câu hỏi và nhận xét, cảm ơn!

Ryan Molecke

Ryan Molecke, Giám đốc Công nghệ (CTO) của EnLedger Corp., là một nhà nghiên cứu khoa học tính toán học thuật đa lĩnh vực cao, người đã chuyển đổi sang thế giới của công nghệ tài chính và hệ thống giao dịch. Anh ấy đã làm việc tại một số công ty khởi nghiệp công nghệ tài chính nổi tiếng và thành công, giúp kiến ​​trúc hệ thống giao dịch và môi giới / sàn giao dịch, và hiện đang tập trung vào sổ cái được phép và tích hợp hệ thống blockchain, mã thông báo và các chương trình tín dụng. Anh ấy có bằng B.S.E. trong Kỹ thuật Máy tính và bằng Tiến sĩ trong Khoa học nano và Kỹ thuật Hệ thống vi mô, cả hai đều từ UNM

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map