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

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


