Solidity语言详解
Solidity語言學習學習總結
文章目錄
- Solidity語言學習學習總結
- 一、合約文件剖析
- 1.1一個合約文件的結構如下:
- 1.2合約的引入import
- 1.3引入狀態變量、函數、事件、函數修改器
- 二、Solidity語言類型
- 2.1常量
- 2.2地址類型
- 2.3bool真假值類型
- 2.4整型特性與運算
- 2.5底層位運算
- 2.6固定長度字節數組byte
- 使用byte數組的理由:
- 三、數據存儲
- 3.1string內存原理
- 四、以太坊地址本質
- 五、使用錢包轉移資金
- 六、智能合約眾籌例子
- 6.1、角色說明
關于solidity語言我們從三個方面來學習,分別從
我們在學習一門新語言的時候,通常從基礎語法到函數,再到文件、結構體進行學習,最后深入到框架。以上三個點是solidity語言區別于其他語言的三個顯著點,所以提出來著重講。
這是solidity官方文檔:https://learnblockchain.cn/docs/solidity/installing-solidity.html#remix
一、合約文件剖析
1.1一個合約文件的結構如下:
這是一個完整的合約結構:
1.2合約的引入import
import "文件名.sol"兩個合約文件的引入:
1.3引入狀態變量、函數、事件、函數修改器
pragma solidity ^0.4.0;import "solidity_for_import.sol";//引入另外一個合約/*this is a Contract @auth:Linghu */ contract Test{//引入狀態變量uint a;//引入函數function setA(uint x) public {a=x;//調用setA時觸發事件Set_Aemit Set_A(x);//利用web3隨時監聽我們的事件}//引入事件event Set_A(uint a);//定義結構體struct Position{int lat;int lng;}address public ownerAddr;//定義函數修改器modifier ownerAddr(){require(msg.sender==ownerAddr);_;}function mine() public owner {a+=1;}}二、Solidity語言類型
2.1常量
-
有理數常量和整型常量
-
字符常量
-
十六進制常量
-
地址常量
2.2地址類型
address:表示一個賬戶地址(20B)
| balance | transfer() |
balance表示賬戶地址的余額;函數transfer表示地址轉移的以太幣;
2.3bool真假值類型
// SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract BooleanTest{bool a;function getBool() public view returns(bool){return a;}/*function getBool2() public view returns(bool){return !a;//取反}*/}默認返回值是 false
2.4整型特性與運算
// SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract Math{uint numa=4;uint numb=2;function add(uint a,uint b)public pure returns(uint){return a+b;}function jian(uint a,uint b)public pure returns(uint){return a-b;}function cheng(uint a,uint b)public pure returns(uint){return a*b;}function chu(uint a,uint b)public pure returns(uint){return a/b;}}2.5底層位運算
- &
- |
- ^
- << 左移
- 》》(>>)不好表示括號里的符號 右移
1.& 操作數之間轉換成二進制之后每位進行與運算操作(同1取1)
2.| 操作數之間轉換成二進制之后每位進行或運算操作(有1取1)
3.~ 操作數轉換成二進制之后每位進行取反操作(直接相反)
4.^ 操作數之間轉換成二進制之后每位進行異或操作(不同取1)
5.<<操作數轉換成二進制之后每位向左移動x位的操作
6.>>操作數轉換成二進制之后每位向右移動x位的操作
2.6固定長度字節數組byte
一個byte=8個位(XXXX XXXX)X為0或1,二進制表示
byte數組為bytes1,bytes2,。。。,bytes32,以八個位遞增,即是對位的封裝
舉例
bytes1=uint8
bytes2=unit16
。
。
。
bytes32=unit256
使用byte數組的理由:
1.bytesX可以更好地顯示16進制
舉例:bytes1=0x6A,bytes1=(XXXX XXXX)正好四個表示一個16進制,以此類推
2.bytes數據聲明時加入public可以自動生成調用長度的函數,見下
3.bytes內部自帶length長度函數,而且長度固定,而且長度不可以被修改。
// SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract Math{bytes1 public num1=0x12;bytes4 public num2=0x12121212;function getlength1()public view returns(uint8){return num1.length;}function getlength2()public view returns(uint8){return num2.length;} }三、數據存儲
3.1string內存原理
// SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract DynamicByte{string name="linghu";function getLength() public view returns(uint){return bytes(name).length;//通過byte強制轉換獲取長度}function changename() public view returns(bytes1){return bytes(name)[1];}function getName() public view returns(bytes memory){return bytes(name);}}四、以太坊地址本質
賬戶初始化的地址為:
每個賬戶都有自己的地址。
五、使用錢包轉移資金
payable關鍵字代表我們可以通過這個函數給我們的合約進行充值、轉賬、默認、
// SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract PayableTest{function pay() payable{} //獲取賬戶上的金額function getBalance() returns(uint){return address(this).balance;} }地址主要有兩個:
六、智能合約眾籌例子
6.1、角色說明
該案例涉及兩個角色:
- 募集資金者(受益者)
- 資金投資者(捐贈者)
與受益人綁定
_needer.map[ _needer.funderAcoount] = funder(_address , msg.value );
}
//@param _neederAmount 受益人的id
function ISconpelete( uint _neederAmount){
needer storage _needer = needmap[_neederAmount];
if(_needer.amount >=_needer.goal ){
_needer.Neederaddress.transfer(_needer.amount);
}
}
}
總結
以上是生活随笔為你收集整理的Solidity语言详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 业务应用系统的业务操作日志设计
- 下一篇: 华为签约俄罗斯计算机大赛冠军,华为为啥去