深入理解Solidity

Solidity源文件布局

pragma(版本雜注)

  • 用于指定源文件的版本,表明編譯器的版本,例如 pragma solidity ^0.4.0
  • ^用于指代版本號需要大于0.4.0但是不可以超過大的層級,必須小于0.5.0
  • 也可以使用大于等于小于來指定版本

import(導入其它源文件)

  • Solidity所支持的導入語句import,語法和JavaScript非常類似
  • import “filename”;? 從“filenmae”中導入所有的全局富豪到當前的全局作用域中
  • import * as symbolName from “filename”;? 創建一個新的全局符號symbolName,其成員均來自于“filename”中的全局符號
  • import {symbol1 as alias ,symbol2} from "filename"; 創建新的全局符號alias和symbol2,分別從“fikename'”引用symbol1和symbol2
  • import “filename” as symbolName;這條語句等同于import * as symbolName from “filename”;?

Solidity值類型

  • 布爾(bool)可能的結果為字符常量值true或者false
  • 整型(int/uint)分別表示有符號和無符號的不同位數的整型變量,支持關鍵字uint8到uint256(無符號,從8位到256位)以及int8到int256,每8位為一個步長進行遞增
  • 定長浮點型(fixed/ufixed):表示各種大小的有符號的無符號的定長浮點型,在關鍵字ufixedMxN和fixedMxN中,M表示該類型占用的位數,N表示可用的小數的位數,這個必須要小于80
  • 地址(address)存儲一個20字節的值(以太坊的地址的大小)
  • 定長字節數組:關鍵字有bytes1、bytes2、bytes3,。。。,bytes32,如果沒有數字bytes就是不定長的
  • 枚舉(enum)一種用戶可以定義類型的方法,與C語言類似,默認從0開始遞增,一般用于模擬合約的狀態
  • 函數(function)一種表示函數的類型

Solidity引用類型

數組(Array)

  • 數組可以在聲明的時候指定長度(定長數組),也可以動態調整大小(變長數組/動態數組)
  • 對于存儲型(storage)的數組來說,元素的類型可以是任意的(即元素可以是數組類型、映射類型或者結構體)
  • 對于內存型(memory)的數組來說,元素的類型不能是映射(mapping)類型

結構(Struct)

  • Solidity 支持通過構造結構體的形式來定義新的類型

映射(Mapping)

  • 映射可以看作哈希表,在實際的初始化過程中創建每一個可能的key,并且將其映射到字節形式全是0的值(類型默認值)

Solidity地址類型

address

  • 地址類型存儲一個20字節的值(以太坊地址的大小),地址的類型也有成員變量,并作為所有合約的基礎

address payable(V0.5.0引入)

  • 與地址類型基本相同,不過多出了transfer和send;兩個成員變量

兩者的區別和轉換

  • Payable地址是可以發送ether的地址,普通的address是不可以的
  • 允許從payable address到address的隱式轉換,而反過來的直接轉換是不可能的(唯一的方法是通過uint160來進行中間轉換)
  • 從0.5.0版本起,合約不再是從地址類型派生而來,但是如果它有payable回退函數,那同樣可以顯示轉換為address或者addresspayable類型

具體

  • <address>.balance(uint256) 該地址的ether余額,以Wei為單位
  • <address payable>.transfer(uint256 amount) 向指定地址發送數量為amount的ether(以Wei為單位),失敗時拋出異常,發送23000gas的礦工費,不可以調節
  • <address payable>.send(uint256 amount)returns(bool)向指定地址發送數量為amount的ether(以Wei為單位),失敗時返回false,發送23000gas的礦工費,不可以調節
  • <address>.call(bytes memory)returns (bool,bytes memory) 發出底層函數CALL,失敗時候返回false,發送所有可用的gas,可以調節
  • <address>.delegatecall(bytes memory)returns (bool,bytes memory)發出底層函數DELEGATECALL,失敗時候返回false,發送所有可用的gas,可以調節
  • <address>.staticcall(bytes memory) returns(bool,bytes memory)發出底層函數STATICCALL,失敗時候返回false,發送所有可用的gas,可以調節

用法

balance和transfer

  • 可以使用一個balance屬性來查詢一個地址的余額,可以使用tranafer函數像一個payable地址發送以太幣Ether(以wei為單位)
address payable x = address(0x123);
address myaddress = address(this);
if(x.balance < 10 && myaddress.balance >= 10)
x.transfer(10);
  • 哪個地址調用transfer函數,就向哪個地址轉錢。以太坊的水管合約,發起交易實質是香我們的賬戶打錢

send

  • send是transfer的初級版本。如果執行失敗,當前的合約不會因為異常而終止,但是send會返回false

call

  • 通過添加call來實現轉幣操作,通過添加.gas()和.value()裝飾器
nameReg.call.gas(1000000).value(1 ether)(abi.encodeWithSignature("register(string)","MyName"));

字符數組(Byte Arrays)

定長字符數組

  • 屬于值類型,bytes1、bytes2,。。。,bytes32分別代表了長度1到32的字節序列

  • 有一個.length屬性,返回數組的長度(只讀)

變長字符數組

  • 屬于引用類型,包括bytes和string,不同的是bytes是Hex字符串,而string是UTF-8編碼的字符串

數組

  • 固定大小k和元素類型T的數組被寫成T[k],動態大小的數組為T[]。例,一個由5個uint動態數組組成的數組是uint[][5],和C語言不一樣,固定大小寫在數組的第二個[]里面
  • 要訪問第三個動態數組中的第二個uint,可以使用x[2][1]
  • 越界訪問數組,會導致調用失敗回退
  • 如果要添加新的元素,則必須受用.push()或者將.length增大
  • 變長的storage數組和bytes(不包括string)有一個push()方法。可以將一個新的元素附加到數組的末端,返回值為當前的數組長度
  • 例子
pragma solidity >=0.4.16 <0.6.0
contract C{function f(uint len)public pure{uint[] memory a = new uint[](7);bytes memory b = new bytes(len);assert(a.length == 7);assert(b.length == len);a[6] = 8;}
}

枚舉

  • 枚舉類型用來用戶自定義一組常量值
  • 和C語言類似,對應整型值,從0開始累加
pragma solidity >=0.4.0 <0.6.0;
contract Purchase{enum Weekday {Monday,Thusday,Wednesday}function test() public pure returns(uint16){Weekday wd = Weekday.Wednesday;return uint16(wd);//2}
}

結構

  • 結構體可以在映射和數組中使用,他們本身可以包含映射和數組
  • 結構不能包含自己類型的成員,但是可以作為自己數組成員的類型,也可以作為自己映射成員的值類型
pragma solidity >=0.4.0 <0.6.0
contract Ballot{struct Voter{uint weight;bool voted;uint vote;}
}

映射(Mapping)

  • 聲明一個映射 mapping(_KeyType => _ValueType)
  • _KeyType可以是任何基本類型,這意味著它可以是任何內置值類型加上字符數組和字符串。不可以使用用戶定義的或者復雜的類型,如枚舉、映射、結構以及除了bytes和string之外任何數組類型。投票合約的時候,使用地址映射一個結構體,可以使用簡單結構來映射復雜結構,不可以使用復雜結構來映射簡單結構。本質上類似key-value的形式,使用簡單的結構來查詢復雜結構,但是不可以通過復雜結構來查詢簡單結構。
  • _ValueType可以是任何類型,包括映射

例子

  • 合約D調用合約C
pragma solidity ^0.4.0;
contract C{mapping (address => uint)balances;constructor(){balances[address(this)] = 300;}function updata(uint amount)public{balances[msg.sender] = amount;}function getBalance(address _addr)public returns (uint){return balances[_addr];}
}contract D{function fun() public returns(uint){C c = new C();//調用C合約c.update(10);//將C合約的復制了一份到D合約,將其改成了10return c.getBalance(address(c));//C合約的仍然是300return c.getBalance(address(this));//this指代當前合約D,合約是10return c.getBalance(msg.sender);//部署合約的地址,因此是0}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447191.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447191.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447191.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H264 流媒體 編碼匯總

實時傳輸協議&#xff08;RTP&#xff09;和實時控制協議&#xff08;RTCP&#xff09; RTP是一種提供端對端傳輸服務的實時傳輸協議&#xff0c;用來支持在單目標廣播和多目標廣播網絡服務中傳輸實時數據&#xff0c;而實時數據的傳輸則由RTCP協議來監視和控制。 RTP定義在RFC…

使用多線程的方式調用chineseocr_API

ChineseOCR在線API 網頁鏈接 界面 提供多種接口調用方式&#xff0c;比如在線調用、Javascript api調用、curl api調用和python api調用四種方式&#xff0c;本次使用javascript api調用的方式進行OCR識別代碼 import glob import base64 import os import requests import …

開源好代碼 音視頻

VirtualDub 一、簡介 圖1VirtualDub主界面 VirtualDub是一款開源的音視頻捕獲、處理軟件。VirtualDub也可稱為一款多媒體編輯軟件&#xff0c;因為它包含了多媒體輸入、編輯、處理、輸出等各個環節&#xff0c;但是作者并未將它定位為一款多媒體編輯軟件&#xff08;參見官網&a…

MAC對于Excel表格換行操作

按住option之后&#xff0c;點擊Enter就可以完成換行操作

深入理解Solidity 二

Solidity數據位置 所有復雜的數據類型&#xff0c;即數組、結構和映射類型&#xff0c;都會有一個額外屬性“數據位置”&#xff0c;用來指定數據的存儲位置&#xff0c;即數據是存儲在memory還是存儲在storage里面根據上下文環境&#xff0c;IDE會自動指定數據的默認存儲位置…

VOIP簡介

一、什么是VOIP VOIP全稱為&#xff08;VoiceOver Internet Protocol&#xff09;&#xff0c;是一種利用Internet網絡進行語音通信的技術&#xff0c;更通俗一點說&#xff0c;就是IP電話。就是以IP分組交換網為傳輸平臺&#xff0c;對模擬的語音信號進行編碼壓縮&#xff0c…

深入理解Solidity 三

Solidity函數聲明和類型 函數的值類型有兩類&#xff1a;內部&#xff08;internal&#xff09;類型和外部&#xff08;external&#xff09;類型內部函數只可以在當前合約內部被調用&#xff08;即在當前代碼塊內&#xff0c;包括內部庫函數和繼承函數&#xff09;&#xff0c…

HTTP狀態代碼及其定義

狀態行包含HTTP版本、狀態代碼、與狀態代碼對應的簡短說明信息。在大多數情況下&#xff0c;除了Content-Type之外的所有應答頭都是可選的。但Content-Type是必需的&#xff0c;它描述的是后面文檔的MIME類型。雖然大多數應答都包含一個文檔&#xff0c;但也有一些不包含&#…

安裝solc模塊4.25版本

使用國產阿里云的cnpm 如果不知道cnpm 參考鏈接 安裝solc模塊4.25版本 npm i solc0.4.25 --save -g查看安裝是否成功 可以配置軟連接使用solc&#xff0c;我的沒有配置 solcjs --version

conda關鍵命令

創建環境 創建名字為python3的虛擬環境&#xff0c;并且指定conda的python版本為3.6--name也可以縮寫為-namepython3.6 是指定python的版本號,如果不指定就默認為裝anaconda時python版本python3是創建的新的虛擬環境的名字&#xff0c;創建完&#xff0c;虛擬環境安裝在anacon…

GDB 調試程序 詳解 使用實例

用GDB調試程序 GDB概述 ———— GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許&#xff0c;各位比較喜歡那種圖形界面方式的&#xff0c;像VC、BCB等IDE的調試&#xff0c;但如果你是在UNIX平臺下做軟件&#xff0c;你會發現GDB這個調試工具有比VC、BCB的圖形化…

在pycharm中使用conda虛擬環境(conda虛擬環境是已經創建好的),解決python安裝包文件很費勁的問題

查看conda的虛擬環境 使用PyCharm連接conda創建的虛擬環境&#xff0c;需要一個前提就是虛擬環境必須存在&#xff0c;使用conda env list命令查看虛擬環境列表打開PyCharm軟件 打開pycharm&#xff0c;選擇File->setting->Project:****->Project Interperter&#…

YUV測試序列下載地址

1、http://www.tkn.tu-berlin.de/research/vid/&#xff08;此網站已經移走&#xff0c;正在尋找。&#xff09; CIF&#xff1a; Akiyo、Bridge (far) 、Bridge (close) 、Bus 、Container 、Coastguard 、Flower 、Football 、Foreman 、Hall 、Highway 、Mobile & Calen…

flask 安裝flask_resultful

命令如下 conda install -c https://conda.anaconda.org/conda-forge flask-restful

完成一個H.265/HEVC碼流分析工具

經過大約一個月左右的業余時間&#xff0c;終于初步完成一個H.265/HEVC碼流分析工具。時間包括平時的周末、晚上&#xff0c;以及調休的集中時間。當然&#xff0c;中秋回家過節不寫代碼。截至今天&#xff0c;經過多種H.265序列測試&#xff0c;也有各種工具對比&#xff0c;基…

Linux中創建用戶并且配置sudo權限,百分百簡單有效

配置步驟如下&#xff1a; 登陸或切換到root用戶下&#xff1b;因為只有root用戶才具有權限進行用戶的添加&#xff0c;使用命令sudo su&#xff0c;切換為管理員用戶添加用戶 adduser -m youuser&#xff0c;并且在home路徑下創建同名的用戶文件夾passwd youuser&#xff0c;…

Java 計算兩個日期之間的相差天數

代碼如下 package com.data.dp;import org.apache.commons.lang3.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat;public class testDate {public static void main(String[] args) throws ParseException {SimpleDateFormat df new Simpl…

【HEVC】目前H265分析軟件推薦

2014-11-14liuwri本帖最后由 zxdaemon 于 2012-12-25 04:06 PM 編輯 1&#xff0c;Codecvisa&#xff1a; http://codecian.com/國產軟件&#xff0c;從最早的H264visa發展至今&#xff0c;感覺從剛開始的玩票&#xff0c;發展到今天專業級別的商業軟件&#xff0c;值得支持。軟…

將IPFS 配置服務器,電腦連接遠程服務器,環境配置

先前安裝配置的步驟省略&#xff0c;僅僅涉及后期的環境修改步驟 1&#xff0c;找到配置文件config&#xff0c;現需要使用命令ipfs init&#xff0c;從而生成.ipfs文件 ipfs init cd ~/.ipfs2&#xff0c;使用命令ls查看當前文件夾下面所包含的文件&#xff0c;正常情況小會…

Golomb及指數哥倫布編碼原理介紹及實現

文章來源&#xff1a; https://www.cnblogs.com/wangguchangqing/p/6297792.html &#xff0c; 寫的不錯&#xff0c;轉發出來。 2017年的第一篇博文。 本文主要有以下三部分內容&#xff1a; 介紹了Golomb編碼&#xff0c;及其兩個變種&#xff1a;Golomb-Rice和Exp-Golo…