深入理解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.mzph.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…