日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Solidity语言详解

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

    成員屬性函數
    balancetransfer()

    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位的操作

    // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract Math{uint a=4;uint b=2;function weiyu()view public returns(uint){return a & b;}function weihuo()view public returns(uint){return a|b;}function weifan()view public returns(uint){return a^b;}function zuoyi()view public returns(uint){return a<<b;}function youyi()view public returns(uint){return a>>b;}}

    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可以自動生成調用長度的函數,見下

    // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract Math{bytes1 public num1=0x12;bytes4 public num2=0x12121212;}

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

    地址主要有兩個:

  • 合約的地址 this代表合約地址
  • 賬戶的地址
  • // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.4.0;contract Transfer{function transfer() public payable{address account=0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;account.transfer(msg.value);//把錢轉到account中去}}

    六、智能合約眾籌例子

    6.1、角色說明

    該案例涉及兩個角色:

    • 募集資金者(受益者)
    • 資金投資者(捐贈者)
    // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.4.4;contract zhongchou{//對象二:捐贈者struct funder{address Funderaddress;uint Tomoney;//捐款金額}//對象一:受益者struct needer{//聲明受益者的結構體address Neederaddress;//聲明一個變量地址,方便打錢給受益者uint goal;//目標金額uint amout;//已經募得金額uint funderAccount;//多少捐贈者mapping(uint=>funder)map;//映射,將捐贈者的id與捐贈者綁定在一起,從而能夠得知,是誰給當前的受益人捐錢了。}uint neederAmount;//受益人的id數量mapping(uint=>needer) needmap;//行為:function NewNeeder(address _Neederaddress,uint _goal){//創建對象,將id號與受益者聯系在一起了neederAmount++;needmap[neederAmount]=needer(_Neederaddress,_goal,0,0);}//@param _address 捐贈者的地址,//@param _neederAmount 受益人的idfunction contribute( address _address, uint _neederAmount) payable{//通過id獲取到受益人對象needer storage _needer = needmap[_neederAmount];//聚集到的資金增加_needer.amount += msg.value;//動態獲取// 捐贈人數增加_needer.funderAcoount++;//將受益人id與受益人綁定_needer.map[ _needer.funderAcoount] = funder(_address , msg.value );}//當募集到的資金滿足條件,就會給給受益人的地址轉賬//@param _neederAmount 受益人的idfunction ISconpelete( uint _neederAmount){needer storage _needer = needmap[_neederAmount];if(_needer.amount >=_needer.goal ){_needer.Neederaddress.transfer(_needer.amount);}}}

    與受益人綁定
    _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语言详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。