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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Solidity语言详解

發(fā)布時(shí)間:2023/12/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Solidity语言详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Solidity語言學(xué)習(xí)學(xué)習(xí)總結(jié)

文章目錄

  • Solidity語言學(xué)習(xí)學(xué)習(xí)總結(jié)
  • 一、合約文件剖析
    • 1.1一個(gè)合約文件的結(jié)構(gòu)如下:
    • 1.2合約的引入import
    • 1.3引入狀態(tài)變量、函數(shù)、事件、函數(shù)修改器
  • 二、Solidity語言類型
    • 2.1常量
    • 2.2地址類型
    • 2.3bool真假值類型
    • 2.4整型特性與運(yùn)算
    • 2.5底層位運(yùn)算
    • 2.6固定長度字節(jié)數(shù)組byte
          • 使用byte數(shù)組的理由:
  • 三、數(shù)據(jù)存儲(chǔ)
    • 3.1string內(nèi)存原理
  • 四、以太坊地址本質(zhì)
  • 五、使用錢包轉(zhuǎn)移資金
  • 六、智能合約眾籌例子
    • 6.1、角色說明

關(guān)于solidity語言我們從三個(gè)方面來學(xué)習(xí),分別從

  • 文件結(jié)構(gòu)
  • 數(shù)據(jù)類型
  • 錯(cuò)誤處理(獨(dú)特)
  • 我們?cè)趯W(xué)習(xí)一門新語言的時(shí)候,通常從基礎(chǔ)語法到函數(shù),再到文件、結(jié)構(gòu)體進(jìn)行學(xué)習(xí),最后深入到框架。以上三個(gè)點(diǎn)是solidity語言區(qū)別于其他語言的三個(gè)顯著點(diǎn),所以提出來著重講。

    這是solidity官方文檔:https://learnblockchain.cn/docs/solidity/installing-solidity.html#remix

    一、合約文件剖析

    1.1一個(gè)合約文件的結(jié)構(gòu)如下:


    這是一個(gè)完整的合約結(jié)構(gòu):

    1.2合約的引入import

    import "文件名.sol"

    兩個(gè)合約文件的引入:

    1.3引入狀態(tài)變量、函數(shù)、事件、函數(shù)修改器

    pragma solidity ^0.4.0;import "solidity_for_import.sol";//引入另外一個(gè)合約/*this is a Contract @auth:Linghu */ contract Test{//引入狀態(tài)變量uint a;//引入函數(shù)function setA(uint x) public {a=x;//調(diào)用setA時(shí)觸發(fā)事件Set_Aemit Set_A(x);//利用web3隨時(shí)監(jiān)聽我們的事件}//引入事件event Set_A(uint a);//定義結(jié)構(gòu)體struct Position{int lat;int lng;}address public ownerAddr;//定義函數(shù)修改器modifier ownerAddr(){require(msg.sender==ownerAddr);_;}function mine() public owner {a+=1;}}

    二、Solidity語言類型

    2.1常量

    • 有理數(shù)常量和整型常量

    • 字符常量

    • 十六進(jìn)制常量

    • 地址常量

    2.2地址類型

    address:表示一個(gè)賬戶地址(20B)

    成員屬性函數(shù)
    balancetransfer()

    balance表示賬戶地址的余額;函數(shù)transfer表示地址轉(zhuǎn)移的以太幣

    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;//取反}*/}

    默認(rèn)返回值是 false

    2.4整型特性與運(yùn)算

    // 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底層位運(yùn)算

    • &
    • |
    • ^
    • << 左移
    • 》》(>>)不好表示括號(hào)里的符號(hào) 右移

    1.& 操作數(shù)之間轉(zhuǎn)換成二進(jìn)制之后每位進(jìn)行與運(yùn)算操作(同1取1)
    2.| 操作數(shù)之間轉(zhuǎn)換成二進(jìn)制之后每位進(jìn)行或運(yùn)算操作(有1取1)
    3.~ 操作數(shù)轉(zhuǎn)換成二進(jìn)制之后每位進(jìn)行取反操作(直接相反)
    4.^ 操作數(shù)之間轉(zhuǎn)換成二進(jìn)制之后每位進(jìn)行異或操作(不同取1)
    5.<<操作數(shù)轉(zhuǎn)換成二進(jìn)制之后每位向左移動(dòng)x位的操作
    6.>>操作數(shù)轉(zhuǎn)換成二進(jìn)制之后每位向右移動(dòng)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固定長度字節(jié)數(shù)組byte

    一個(gè)byte=8個(gè)位(XXXX XXXX)X為0或1,二進(jìn)制表示
    byte數(shù)組為bytes1,bytes2,。。。,bytes32,以八個(gè)位遞增,即是對(duì)位的封裝
    舉例
    bytes1=uint8
    bytes2=unit16



    bytes32=unit256

    使用byte數(shù)組的理由:

    1.bytesX可以更好地顯示16進(jìn)制
    舉例:bytes1=0x6A,bytes1=(XXXX XXXX)正好四個(gè)表示一個(gè)16進(jìn)制,以此類推
    2.bytes數(shù)據(jù)聲明時(shí)加入public可以自動(dòng)生成調(diào)用長度的函數(shù),見下

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

    3.bytes內(nèi)部自帶length長度函數(shù),而且長度固定,而且長度不可以被修改

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

    三、數(shù)據(jù)存儲(chǔ)

    3.1string內(nèi)存原理

    // 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強(qiáng)制轉(zhuǎn)換獲取長度}function changename() public view returns(bytes1){return bytes(name)[1];}function getName() public view returns(bytes memory){return bytes(name);}}

    四、以太坊地址本質(zhì)

    賬戶初始化的地址為:

    每個(gè)賬戶都有自己的地址

    五、使用錢包轉(zhuǎn)移資金

    payable關(guān)鍵字代表我們可以通過這個(gè)函數(shù)給我們的合約進(jìn)行充值、轉(zhuǎn)賬、默認(rèn)、

    // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.8.7;contract PayableTest{function pay() payable{} //獲取賬戶上的金額function getBalance() returns(uint){return address(this).balance;} }

    地址主要有兩個(gè):

  • 合約的地址 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);//把錢轉(zhuǎn)到account中去}}

    六、智能合約眾籌例子

    6.1、角色說明

    該案例涉及兩個(gè)角色:

    • 募集資金者(受益者)
    • 資金投資者(捐贈(zèng)者)
    // SPDX-License-Identifier: SimPL-2.0 pragma solidity ^0.4.4;contract zhongchou{//對(duì)象二:捐贈(zèng)者struct funder{address Funderaddress;uint Tomoney;//捐款金額}//對(duì)象一:受益者struct needer{//聲明受益者的結(jié)構(gòu)體address Neederaddress;//聲明一個(gè)變量地址,方便打錢給受益者uint goal;//目標(biāo)金額uint amout;//已經(jīng)募得金額uint funderAccount;//多少捐贈(zèng)者mapping(uint=>funder)map;//映射,將捐贈(zèng)者的id與捐贈(zèng)者綁定在一起,從而能夠得知,是誰給當(dāng)前的受益人捐錢了。}uint neederAmount;//受益人的id數(shù)量mapping(uint=>needer) needmap;//行為:function NewNeeder(address _Neederaddress,uint _goal){//創(chuàng)建對(duì)象,將id號(hào)與受益者聯(lián)系在一起了neederAmount++;needmap[neederAmount]=needer(_Neederaddress,_goal,0,0);}//@param _address 捐贈(zèng)者的地址,//@param _neederAmount 受益人的idfunction contribute( address _address, uint _neederAmount) payable{//通過id獲取到受益人對(duì)象needer storage _needer = needmap[_neederAmount];//聚集到的資金增加_needer.amount += msg.value;//動(dòng)態(tài)獲取// 捐贈(zèng)人數(shù)增加_needer.funderAcoount++;//將受益人id與受益人綁定_needer.map[ _needer.funderAcoount] = funder(_address , msg.value );}//當(dāng)募集到的資金滿足條件,就會(huì)給給受益人的地址轉(zhuǎn)賬//@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 );
    }

    //當(dāng)募集到的資金滿足條件,就會(huì)給給受益人的地址轉(zhuǎn)賬

    //@param _neederAmount 受益人的id
    function ISconpelete( uint _neederAmount){
    needer storage _needer = needmap[_neederAmount];
    if(_needer.amount >=_needer.goal ){
    _needer.Neederaddress.transfer(_needer.amount);
    }
    }

    }

    總結(jié)

    以上是生活随笔為你收集整理的Solidity语言详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。