BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

一文讀懂什麼是Soilidity:用於實現智能合約的高級編程語言

ChinaDeFi
特邀专栏作者
2021-12-03 09:30
本文約5778字,閱讀全文需要約9分鐘
面向合約的高級編程語言,被設計用於以太坊虛擬機。
AI總結
展開
面向合約的高級編程語言,被設計用於以太坊虛擬機。

一級標題

一級標題

一級標題

什麼是Soilidity?

pragma solidity >=0.5.0 <0.6.0; 

contract HelloWorld { 

}

在上面的代碼中,我們提供了考慮到我們的代碼與b/w 0.5到0.6的任何版本兼容的版本。我們還創建了一個名為“HelloWorld”的合約。

一級標題

一級標題

contract Example { 

// This will be stored permanently in the blockchain 

uint myUnsignedInteger = 100; 

string name = "vivek"

}

Uint數據類型是一個無符號整數。它應該是非負的。

一級標題

一級標題

數據類型

Boolean(true / false),Integers(int / uint), Address(以太坊地址的大小),String, enum

結構

一級標題

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

結構

一級標題

struct Person { 

uint age; 

string name;

一級標題

一級標題

數組

// 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;

我們可以組合結構和數組。創建一個結構,然後擁有一個結構數組。就像在面向對象範例(如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

一級標題

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

按值和按引用

按值和按引用

eatHamburgers(“vitalik”, 100);

一級標題

一級標題

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

}

私人/公共函數

內部/外部關鍵字

正文

外部類似於公共。除了聲明了這個函數的聯繫人之外,所有的合約都可以調用這個函數。

一級標題

一級標題

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

return “Hi”;

}

一級標題

一級標題

事件

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

事件

正文

// 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; 

}

一級標題

YourContract.NotifyOnFrontend(function(error, result) { 

// do something with result 

})

映射

映射

mapping (address => uint) public accountBalance;

映射

這可以用於在區塊鏈中存儲多個對象(數據)。檢查示例如下:

例子:

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

 } 

}

例子:

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

要獲得這些值,只需傳遞名稱:

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

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

一級標題

這些變量可用於像msg.sender這樣的所有函數。我們所編寫的任何Solidity程序,都應該由所有者調用。發送者的地址存儲在msg.sender 全局變量中。

require

一級標題

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

一級標題

一級標題

有時候,與其製定一個非常長的合約,還不如將代碼邏輯拆分為多個合約來組織代碼。

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

一級標題

這通常是在Solidity項目中處理長代碼庫的方式。

一級標題

存儲是指永久存儲在區塊鏈上的變量。內存變量是臨時的,在對合約的外部函數調用之間會被刪除。可以把它想像成電腦的硬盤與內存。

一級標題

一級標題

一級標題

contract GetNumber { 

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

     return _num; 

}

與區塊鍊網絡中的其他合約交互

contract NumberInterface { 

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

}

關於這一點,我將寫一篇單獨的文章。現在,保持簡短:

在將合約部署到以太坊後,它就變成了不可變的,也就是說它不能被修改。部署到合約中的初始代碼將永久地停留在區塊鏈上。這就是安全性在Solidity中如此重要的原因之一。如果我們的合約代碼中有一個缺陷,就沒有辦法在以後修補它。必須告訴我們的用戶開始使用具有修復功能的不同智能合約地址。

一級標題

一級標題

函數修飾符

gas

用戶支付gas費來在以太坊網絡上運行合約。 gas以以太(以太坊上的貨幣)為單位計算。我們的函數的總gas成本等於它所有單獨操作的總gas成本。

一級標題

一級標題

一級標題

因此,建議盡可能使用內存類型,這樣數據就不會永久存儲,從而節省成本。循環在Solidity中將比使用存儲更便宜。所以盡可能for 循環中使用內存。這與Java、Python等語言中所做的完全相反,因為for循環的計算成本更高。

一級標題

一級標題

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

應付修飾符

正文

正文

一級標題

注意:

一級標題

代幣

所以基本上,代幣只是一個合約,它記錄了誰擁有多少代幣,以及一些函數,以便這些用戶可以將他們的代幣轉移到其他地址。

一級標題

一級標題

Metamask

一級標題

一級標題

一級標題

Web3Js

正文

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

ETH
智能合約
歡迎加入Odaily官方社群