首页 / 资讯中心 / 文章详情

Solidity学习笔记

Solidity学习笔记 ★ FEATURED ARTICLE
以太坊共识协议有pow工作量证明pos权益证明结点类型有普通节点备份区块链数据矿工创建区块链加密算法使用的是ECC椭圆曲线加密算法通信协议使用的是Whisper存储平台使用的是Swarmgeth是以太坊whipster和swarm节点的一个实现帐户类型有外部帐户合约帐户帐户结构有nonce外部帐户表示从该帐户地址发送出的交易数量合约帐户表示该帐户创建过的合约数量balance帐户余额以wei为单位storageRoot该帐户存储内容的Merkle Patricia树的根结点哈希值codeHash外部帐户是空字符串的哈希值合约帐䚮是该帐户的EVM code编译后的智能合约字节码的哈希值solidity流程Solidity代码Solidity编译器字节码部署在EVM上执行文件组成Solidity文件扩展名为.sol由4个结构组成预编译指令注释导入合约/库/接口使用下面指令指定编译器版本pragma Solidityversion number版本声明^0.5.2表示兼容0.5.2以及向后兼容的补丁版本但不包括 0.6.0 及以上版本注释形式有单行注释 用双斜线表示//多行注释 用/*和*/表示以太坊自然规范即三个斜杠///表示单行注释多行注释用/**表示注释开始*/表示注释结束导入其它合约使用importotherContract;//导入所有的全局符号import*as symbolName fromfilename;//导入filename所有的全局符号作为全局符号名symbolName的成员import{symbol1 as alias,symbol2}fromfilename;合约使用关键字contract库使用关键字library接口使用关键字interface合约合约结构包含状态变量结构定义使用struct修改器定义使用关键字modifier修改器与函数绑定。修改器中的下划线_表示执行目标函数。payable是由Solidity提供的修改器当应用于函数时允许函数接受以太币事件声明使用关键字event来定义枚举定义函数定义函数支持的限定符有external, payable(k只能接受以太币), view(常量函数别名),pure(既不能读取也不能写入不能访问状态变量)其修饰符默认是public状态变量定义形式为类型 修饰符 标识符修饰符有internal在没有显示指定情况下默认是internalprivatepublic对于此类型会生成public的获取函数constant对于address public miner生成的函数形式为functionminter()external view returns(address){returnminter;}数据类型支持的有booluint/int从8位到256位没有指定位数时表示的是256位bytesaddressmappingmapping(KeyType KeyName? ValueType ValueName?) VariableNameenumstructstring事件关键字为event形式为eventSent(address from,address to,uint amount);函数其定义为functionFunctionName([parameters]){public|private|internal|external}[pure|constant|view|payable][virtual][modifiers][returns(returntypes)]函数可见性有publicprivateinternalexternal函数读写性有viewconstant0.5.0版本后丢弃pure合约创建有两种方式使用new创建contract Helloworld{}contract client{functioncreateHelloworld()public returns(Helloworld address){returnnewHelloworld()}}使用已经部署的合约地址contract client{functionuseHelloworld(address addr)public{Helloworld hwHelloworld(addr)}}构造函数在用new创建合约时会调用构造函数。构造函数只会调用一次也只能有一个构造函数不能重载。contract Helloworld{construct([参数]){}}继承单继承使用形式为子合约 is 父合约多继承使用形式为子合约 is 父合约1父合约2...在调用继承体系中的函数时可以直接使用父合约.函数直接调用其直接父合约使用super.函数(在多继承中时按照父合约声明顺序调用)需要重载的函数使用virtual修饰符子合约重载父合约函数使用override修饰符重载时支持修改函数的可见性(从不严格转为严格的不能从严格的转不严格的)有external转publicnonpayable转view和pureview转purepayable不能转修改器跟函数一样支持重载也是使用virtual和override对于有参数的构造函数有两种方式直接在继承声明时指定父合约的参数在子合约构造函数中显示指定父合约参数否则只能将合约声明为抽象的抽象合约合约前使用abstract即合约中函数没有实现接口关键字为interface约束有不能包含实现的函数不能继承合约可以继承其它接口所有函数必须是external不能声明构造函数不能声明状态变量不能声明修改器特殊函数receive函数receive()external payable{...}fallback函数fallback()external[payable]fallback(bytes calldata input)external[payable]数据类型值类型有booluint/intaddress分为payable包含transfer和send和不能支付的byte是bytes1的别名字节类型还支持1-32即bytes1-bytes32enum定长浮点型fixed和ufixedMxN其中M表示所占的大小需要为8的位数范围为8-256,N表示小数点的位数范围为0-80定长数组即固定数组int[5] age函数类型对于external和public函数其包含两个属性.address(合约地址)和.selector(abi函数选择器)用户自定义值类型如type aliasName as built-in-type合约类型可以与地址作相互转换引用类型有动态数组int[] age。动态数组可以使用内联初始化或者使用new运算符初始化内联形式为int[] age [1, 2,3],new初始化形式为int[] age new int[](5)。solidity中有特殊数组类型即字节数组bytes和字符串数组string。T[M][N] 表示 N 个长度为 M 的数组外层长度是 N数组切片结构映射type函数type(C).name合约名称type(C).creationCode合约的创建字节码type(C).runtimeCode合约的运行字节码type(I).interfaceId一个 bytes4 值包含给定接口 I 的 EIP-165 接口标识符type(T).min类型T的最小值type(T).max类型T的最大值错误处理require检查输入assert检查结果字面量字符串字面量用单引号或者双引号十六进制字面量以前缀hex作为关键字如hex 1A2B3F全局变量和函数区块blockhash(uint blockNumber) returns (bytes32)当 blockNumber是 256 个最新区块之一时给定区块的哈希值;否则返回零blobhash(uint index) returns (bytes32)与当前事务关联的索引第index个 Blob 的版本化哈希。版本化哈希由代表版本当前0x01的单个字节组成后跟 KZG 承诺 EIP-4844 的 SHA256 哈希的最后 31 个字节。如果不存在具有给定索引的 blob则返回零。block.basefee (uint)当前区块的基本费用EIP-3198 和 EIP-1559block.blobbasefee (uint)当前区块的 blob 基本费用EIP-7516 和 EIP-4844block.chainid (uint)当前链 IDblock.coinbase (address payable)当前区块矿工地址block.difficulty (uint)当前区块难度(EVM Paris)block.prevrandao (uint)信标链提供的随机数 (EVM Paris)block.gaslimit (uint)当前块 gas限制block.number (uint)当前区块编号block.timestamp (uint)当前区块时间戳自 Unix 纪元以来的秒数消息msg.data (bytes calldata)完整的调用数据与创建交易相关的函数及其参数信息msg.sender (address)调用函数的地址msg.sig (bytes4)函数标识符使用散列函数签名后的前四个字节msg.value (uint)随消息发送的以太币数量以wei为单位交易tx.gasprice (uint)交易的 gas 价格tx.origin (address)交易的发送者全调用链加密keccak256(bytes memory) returns (bytes32)计算输入的 Keccak-256 哈希值其基于SH3算法sha256(bytes memory) returns (bytes32)计算输入的 SHA-256哈希值基基于SH2算法地址address.balance (uint256)是address类型的内置全局变量用于查询某个地址的ETH余额单位为wei全局函数有address payable.transfer(uint256 amount)安全转换函数向目标地址发送指定数量的ETH若转帐失败自动回滚当前交易。要求目标地址是address payable类型address payable.send(uint256 amount) returns (bool)低级转账函数但是转账失败不会自动 回滚address.call(bytes memory) returns (bool, bytes memory)通用低级调用函数向目标地址发送一个自定义数据的调用请求地址要求是 EOA或者合约地址( 定义了payable 的 fallback 函数的)address.delegatecall(bytes memory) returns (bool, bytes memory)委托调用函数与call类似但是使用当前合约的上下文address.staticcall(bytes memory) returns (bool, bytes memory)只读调用函数禁止修改任何状态合约合约全局变量有this表示当前合约的类型可以显示转换成地址address contractAddress address(this);合约全局函数有selfdestruct(address payable recipient)销毁当前合约并且把剩余的以太币余额转移到参数指定地址库库里的内部函数是以复制的形式到调用它的合约中内部类型可以传递内存类型以引用传递有以下限制无状态变量不能继承和被继承不能接收以太币不能销毁一个库使用场景节省gas给数据类型添加成员函数主要是代码复用using A for B表示给自定义类型B添加库A中的操作符相当于B的成员函数其中A函数的第一参数相当于python中的selfABI有两种形式一种是参数二进制编码一种是json形式参数编码二进制形式首先是4字节的函数签名然后是对函数参数的编码对于静态类型和动态类型的编码方式不一样动态类型有stringbytes定长数组变长数组元组(T1,…,Tk)元组编码形式为enc(X) head(X(1)) … head(X(k)) tail(X(1)) … tail(X(k))对于静态类型head(X(i)) enc(X(i)) tail(X(i)) “”对于动态类型head(X(i)) enc(len( head(X(1)) … head(X(k)) tail(X(1)) …tail(X(i-1)) )), tail(X(i)) enc(X(i))json形式json形式主要函数、事件或者error的数组形式函数json字段有type其支持的值有function,constructor, receive,fallbackname表示函数名称inputs对象数组其包含以下字段name参数名type参数的规范类型components用于元组类型outputs与inputs类似为对象数组stateMutability支持的值有pure,view,nonpayable和payableconstructor, receive,fallback不会有name和ouputs字段receive,fallback不会有inputs字段事件json字段有type值为eventname表示事件名inputs对象数组其包含以下字段name参数名type参数的规范类型components用于元组类型indexed布尔值如果该字段是日志主题的一部分则为true否则为falseanonymous布尔值如果事件声明为anonymous则为trueerrorjson字段有type值为errorname表示错误名inputs对象数组其包含以下字段name参数名type参数的规范类型components用于元组类型EVM虚拟机数据存储位置类型说明Storage(存储)局部复杂类型变量和状态变量默认存储位置是存储Transient Storage(暂存)与Storage区别是每次交易后会复位Memory(内存)函数参数包含返回值默认存储位置是内存Stack(栈)EVM是基于栈的虚拟机所有计算是基于栈执行的Calldata(调用数据)即发给交易的数据。在创建合约时calldata将是新合约的构造函数代码;abi编码形式外部函数的参数returndata(返回数据)合约调用后的返回值赋值给abi编码的值code(代码)合约存储的位置
阅读完成 · 觉得有帮助?
咨询建站