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

一級標題
一級標題
一級標題
什麼是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


