BTC
ETH
HTX
SOL
BNB
Xem thị trường
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

Đọc Soilidity là gì: ngôn ngữ lập trình cấp cao để triển khai hợp đồng thông minh

ChinaDeFi
特邀专栏作者
2021-12-03 09:30
Bài viết này có khoảng 5778 từ, đọc toàn bộ bài viết mất khoảng 9 phút
Ngôn ngữ lập trình cấp cao theo định hướng hợp đồng được thiết kế cho Máy ảo Ethereum.
Tóm tắt AI
Mở rộng
Ngôn ngữ lập trình cấp cao theo định hướng hợp đồng được thiết kế cho Máy ảo Ethereum.

tiêu đề cấp đầu tiên

Sự vững chắc là gì?

Solidity là ngôn ngữ lập trình cấp cao theo định hướng hợp đồng để thực hiện các hợp đồng thông minh. Solidity đã được thiết kế cho Máy ảo Ethereum.

Tính vững chắc = = = hợp đồng thông minh.

pragma solidity >=0.5.0 <0.6.0; 

contract HelloWorld { 

}

Trong mã ở trên, chúng tôi cung cấp các phiên bản có tính đến việc mã của chúng tôi tương thích với mọi phiên bản b/w 0,5 đến 0,6. Chúng tôi cũng đã tạo một hợp đồng có tên là "HelloWorld".

tiêu đề cấp đầu tiên

Biến trạng thái và số nguyên

contract Example { 

// This will be stored permanently in the blockchain 

uint myUnsignedInteger = 100; 

string name = "vivek"

}

Kiểu dữ liệu Uint là số nguyên không dấu. Nó phải không âm.

tiêu đề cấp đầu tiên

loại dữ liệu

Loại giá trị:

Boolean (đúng/sai), Số nguyên (int/uint), Địa chỉ (Kích thước địa chỉ Ethereum), Chuỗi, enum

Loại tham chiếu:

tiêu đề cấp đầu tiên

Addition: x + y 

Subtraction: x — y, 

Multiplication: x * y 

Division: x / y 

Modulus / remainder: x % y (for example, 13 % 5 is 3, because if you divide 5 into 13, 3 is the remainder)

Exponential Operation uint x = 5 ** 2; // equal to 5² = 25

kết cấu

tiêu đề cấp đầu tiên

struct Person { 

uint age; 

string name;

mảng

mảng

Một tập hợp dữ liệu được gọi là một mảng. Hai loại: mảng cố định và mảng động.

// Array with a fixed length of 2 elements: 

uint[2] fixedArray;

// another fixed Array, can contain 5 

strings: string[5] stringArray;

// a dynamic Array — has no fixed size, can keep growing: 

uint[] dynamicArray;

Chúng ta có thể kết hợp cấu trúc và mảng. Tạo một cấu trúc, sau đó có một mảng các cấu trúc. Nó giống như có một đối tượng và một mảng đối tượng trong mô hình hướng đối tượng như Java.

pragma solidity >=0.5.0 <0.6.0; 

contract StudentFactory { 

  struct student { 

     string name; 

      uint roll; } student[] public students; // creates an array named students of student type objects

tiêu đề cấp đầu tiên

function eatHamburgers(string memory _name, uint _amount) public { }

khai báo hàm

Theo giá trị và theo tham chiếu

eatHamburgers(“vitalik”, 100);

tiêu đề cấp đầu tiên

chức năng riêng tư/công khai

function _eatHamburgers(string memory _name, uint _amount) private { 

}

Theo quy ước, các chức năng riêng tư bắt đầu bằng dấu gạch dưới.

từ khóa nội bộ/bên ngoài

chữ

Bên ngoài tương tự như công cộng. Chức năng này có thể được gọi bởi tất cả các hợp đồng ngoại trừ người liên hệ khai báo chức năng này.

tiêu đề cấp đầu tiên

trở lại trong chức năng

function sayHi() public view/pure returns (string memory) { 

return “Hi”;

}

Các chức năng này có thể được đánh dấu là thuần túy/xem. Chúng tôi đánh dấu một chức năng là thuần túy khi chúng tôi thậm chí không có quyền truy cập vào dữ liệu đã truyền. Nếu hàm không sửa đổi dữ liệu mà chỉ xem dữ liệu thì sẽ được đánh dấu là đã xem.

tiêu đề cấp đầu tiên

sự kiện

uint8 a = 5; 

uint b = 6;

// line below throws an error because a*b returns a uint, not uint8: 

uint8 c = a * b;

// we have to typecast b as a uint8 to make it work: 

uint8 c = a * uint8(b);

sự kiện

chữ

// declare the event 

event NotifyOnFrontend(uint x); 

function add(uint _x, uint _y) public returns (uint) { 

  uint result = _x + _y; 

//fire an event to let the frontend know the function was called 

  emit NotifyOnFrontend(result); 

  return result; 

}

tiêu đề cấp đầu tiên

YourContract.NotifyOnFrontend(function(error, result) { 

// do something with result 

})

bản đồ

bản đồ

mapping (address => uint) public accountBalance;

Đây là một cách khác để lưu trữ dữ liệu có tổ chức như mảng và cấu trúc

Điều này có thể được sử dụng để lưu trữ nhiều đối tượng (dữ liệu) trong chuỗi khối. Một ví dụ kiểm tra như sau:

ví dụ:

contract Example { 

    struct UserInfo { 

          unit age; string dob;

    mapping(string => UserInfo) allusers;

function setUserInfo(string _name, uint _age, string _dob) public {
   allusers[_name].age = _age;
   allusers[_name].dob = _dob;
}

function getUserInfo(string name) public view returns(uint, string) { 

     return (allusers[name].age, allusers[_name].dob); 

 } 

}

ví dụ:

setuserInfo("Vivek",26, 25/05/1995) setuserInfo("Supu", 23, 01/09/1998)

Để có được những giá trị này, chỉ cần chuyển tên:

getUserInfo("Vivek"); // 26 25/05/1995 

getuserInfo("Supu"); // 24 01/09/1998

tiêu đề cấp đầu tiên

Các biến này có sẵn cho tất cả các chức năng như msg.sender. Bất kỳ chương trình Solidity nào chúng tôi viết nên được gọi bởi chủ sở hữu. Địa chỉ của người gửi được lưu trong biến toàn cục msg.sender.

require

tiêu đề cấp đầu tiên

function sayHi(string memory name) public returns (string memory) { /Compares if _name equals “Vivek” Throws an error and exits if not true. Solidity doesn’t have native string comparison, so we compare their keccak256 hashes to see if the strings are equaq / 

require(keccak256(abi.encodePacked(name)) == keccak256(abi.encodePacked(“Vivek”)));

// If it’s true, proceed with the function: 

return “Hi!”;

sayHi(“Vivek”) // executes successfully 

sayHi(“Supu”) // throws an error

Do đó, yêu cầu rất hữu ích để xác minh rằng các điều kiện nhất định phải đúng trước khi chạy một chức năng.

thừa kế

Đôi khi, thay vì tạo một hợp đồng rất dài, tốt hơn là chia logic mã thành nhiều hợp đồng để tổ chức mã.

contract Animal {

   function catchphrase() public returns (string memory) { 

      return “Animal”;

  } 

} contract Cat is Animal {

   function anotherCatchphrase() public returns (string memory) { 

    return “Cat is an Animal”;

}

}

import

tiêu đề cấp đầu tiên

Đây thường là khoảng thời gian các cơ sở mã được xử lý trong các dự án Solidity.

tiêu đề cấp đầu tiên

Lưu trữ đề cập đến các biến được lưu trữ vĩnh viễn trên chuỗi khối. Các biến bộ nhớ là tạm thời và bị xóa giữa các lệnh gọi hàm bên ngoài tới hợp đồng. Hãy coi nó giống như ổ cứng và bộ nhớ của máy tính.

tiêu đề cấp đầu tiên

Tương tác với các hợp đồng khác trong mạng blockchain

Tôi sẽ viết một bài riêng về việc này. Bây giờ, hãy giữ cho nó ngắn gọn:

contract GetNumber { 

   function getNum(uint _num) public returns(uint){ 

     return _num; 

}

Để tương tác với các hợp đồng khác, chúng tôi khai báo một giao diện giống như đối tượng. Chúng tôi tạo một hợp đồng và bên trong nó khai báo một chức năng mà chúng tôi muốn gọi hoặc sử dụng từ một hợp đồng khác. Một chức năng chỉ là một bộ xương, nó không chứa một cơ thể.

contract NumberInterface { 

  function getNum(uint _num) public returns(uint); 

}

Giả sử có một hợp đồng và chúng tôi muốn sử dụng hàm getNum ở trên. Để làm điều này, chúng tôi sẽ tạo một hợp đồng trong dự án của chúng tôi và khai báo một khung hàm getNum (không có thân hàm).

Sau khi một hợp đồng được triển khai cho Ethereum, nó trở nên bất biến, nghĩa là không thể sửa đổi nó. Mã ban đầu được triển khai trong hợp đồng sẽ tồn tại trên chuỗi khối mãi mãi. Đây là một trong những lý do tại sao bảo mật rất quan trọng trong Solidity. Nếu có lỗi trong mã hợp đồng của chúng tôi, không có cách nào để vá nó sau này. Phải yêu cầu người dùng của chúng tôi bắt đầu sử dụng một địa chỉ hợp đồng thông minh khác với bản sửa lỗi.

tiêu đề cấp đầu tiên

công cụ sửa đổi chức năng

Điều này giúp cập nhật các phần quan trọng của DApp đồng thời ngăn người dùng khác vi phạm hợp đồng của chúng tôi. Một trường hợp sử dụng mà tôi đã xử lý là - khi chúng tôi muốn xác thực câu lệnh trước khi thực hiện bất kỳ trường hợp sử dụng nào.

gas

Người dùng trả phí gas để chạy các hợp đồng trên mạng Ethereum. Gas được tính bằng ether (đơn vị tiền tệ trên Ethereum). Tổng chi phí gas của chức năng của chúng tôi bằng với tổng chi phí gas của tất cả các hoạt động riêng lẻ của nó.

tiêu đề cấp đầu tiên

Tìm hiểu thêm về lưu trữ

Bộ nhớ lưu trữ được ghi vĩnh viễn vào chuỗi khối. Hàng nghìn nút trên khắp thế giới cần lưu trữ dữ liệu này trên ổ cứng của họ và khi chuỗi khối phát triển, lượng dữ liệu này sẽ tăng theo thời gian. Vì vậy, làm điều này đi kèm với một mức giá.

Vì vậy, nên sử dụng loại bộ nhớ càng nhiều càng tốt để dữ liệu không được lưu trữ vĩnh viễn, nhờ đó tiết kiệm chi phí. Các vòng lặp trong Solidity sẽ rẻ hơn so với sử dụng bộ nhớ. Vì vậy, hãy sử dụng bộ nhớ trong vòng lặp càng nhiều càng tốt. Điều này hoàn toàn ngược lại với những gì được thực hiện trong các ngôn ngữ như Java, Python, v.v., bởi vì các vòng lặp for đắt hơn về mặt tính toán.

tiêu đề cấp đầu tiên

Cú pháp tương tự như Javascript.

for (uint i = 1; i <= 10; i++) { // body }

Đối phó với công cụ sửa đổi

chữ

Các chức năng thanh toán là một phần khiến Solidity và Ethereum trở nên tuyệt vời -- chúng là một loại chức năng đặc biệt có thể nhận Ether. Khi chúng tôi gọi một chức năng API trên một máy chủ web bình thường, chúng tôi không thể gửi đô la cùng lúc khi chúng tôi gọi chức năng này -- chúng tôi cũng không thể gửi bitcoin.

Điều này cho phép một số logic rất thú vị, chẳng hạn như trả phí cho một hợp đồng để thực hiện một chức năng.

Để ý:

tiêu đề cấp đầu tiên

Mã thông báo

Về cơ bản, mã thông báo chỉ là một hợp đồng ghi lại ai sở hữu bao nhiêu mã thông báo và một số chức năng để những người dùng đó có thể chuyển mã thông báo của họ sang các địa chỉ khác.

tiêu đề cấp đầu tiên

Khẳng định tương tự như yêu cầu và đưa ra lỗi nếu sai. Sự khác biệt giữa khẳng định và yêu cầu là yêu cầu hoàn lại lượng gas còn lại của người dùng khi một chức năng bị lỗi, trong khi khẳng định thì không.

Metamask

Đây là tiện ích mở rộng trình duyệt dành cho Chrome và Firefox cho phép người dùng quản lý an toàn tài khoản Ethereum và khóa cá nhân của họ, đồng thời sử dụng các tài khoản này để tương tác với các trang web bằng Web3.js.

tiêu đề cấp đầu tiên

tiêu đề cấp đầu tiên

Web3Js

chữ

Source:https://medium.com/coinmonks/learn-all-about-solidity-ethereum-45d709c4de77

ETH
hợp đồng thông minh
Chào mừng tham gia cộng đồng chính thức của Odaily
Nhóm đăng ký
https://t.me/Odaily_News
Nhóm trò chuyện
https://t.me/Odaily_CryptoPunk
Tài khoản chính thức
https://twitter.com/OdailyChina
Nhóm trò chuyện
https://t.me/Odaily_CryptoPunk