solidity编程

您所在的位置:网站首页 solidity编程语言 solidity编程

solidity编程

#solidity编程| 来源: 网络整理| 查看: 265

Solidity介绍 合约结构状态变量数据类型结构修改器事件枚举函数 数据类型值类型

合约由多个结构组成:

状态变量结构定义修改器定义事件声明枚举定义函数定义 合约结构 状态变量

编程中的变量是指可以包含值的存储单元。值可以在运行时更改。可以在代码中的多个位置使用变量,并且它们都将引用存储的值。 solidity提供两种类型的变量——状态变量和内存变量。 在合约中,没有在任何函数内声明的变量成为状态变量。状态变量存储合约的当前值。状态变量的内存是静态分配的,并且在合约生命周期内不能改变(分配的内存大小)。必须静态定义每个状态变量的类型。 状态类型的限定符:

internal:默认情况下,如果没有指定任何内容,则状态变量具有internal限定符。意味这个变量只能在当前的合约函数和任何继承它们的合约中使用。这些变量不能被外部访问修改,但是可以查看。内部状态变量的示例如下: int internal StateVariable; private:私有状态变量只能在声明它们的合约中使用。即使在派生合约中也不能使用。私有状态变量的示例如下: int private privateStateVariable; public:公共状态变量可以被直接访问。公共状态变量的示例如下: int public stateIntVariable; constant:常量状态变量不可变,在声明时必须赋初值。常量状态变量的示例如下: bool constant hasIncome = true; 数据类型

solidity提供以下多种开箱数据类型:

booluint/intbytesaddressmappingenumstructbytes/String 结构

结构或结构体有助于实现自定义的用户数据类型。结构是一种复合数据类型,由多个不同数据类型的变量组成。结构不包含代码,只包含变量。solidity中的结构使用struct关键字。

struct myStruct{ //定义变量 string name; }

注:关键字new只用于创建合约或者数组的实例。如下:

human = myStruct("Ritesh",10,true,new uint[](3));

在函数中可以创建多个结构体的实例,结构体可以包含数组和映射变量,映射和数组可以存储结构体的值。

修改器

编程语言中的修改器是指改变执行代码行为的结构。在solidity中,修改器总与函数关联,因此它可以改变其关联函数的行为。此外,修改器可以与多个函数关联。 简单来说,可将修改器视为在执行目标函数之前执行的函数。假设你想要调用getAge函数,但在执行之前,你想要执行另一个函数来检查合约的当前状态、传入参数中的值、状态变量中的当前值等,并相应地决定是否应该执行目标函数getAge。 修改器使用modifier关键字后跟修改器标识符、应该接受的任何参数、花括号{ }内编写的代码来进行定义。修改器中的“_”(下划线)表示执行目标函数。 在合约中声明modifier关键字,如下所示:

modifier onlyBy(){ if(msg.sender == personIdentifier){ _; } }

msg.sender 用来检查传入地址的值,msg.sender 保存地址并将其存储在状态变量中。 将上面的修改器与getAge函数关联,示例如下:

pragma solidity ^0.4.19; contract generalStructure{ int public stateIntVariable; string stateStringVariable; address personIdentifier; myStruct human; bool constant hasIncome = true ; struct myStruct{ string name; uint myAge; bool isMarried; uint[] bankAccountsNumbers; } modifier onlyBy(){ if(msg.sender == personIdentifier){ _; } } event ageRead(address,string); enum gender {male,female} function getAge(address _personIdentifier) onlyBy() payable external returns(uint){ human = myStruct("Bob",10,true,new uint[](3)); gender _gender = gender.male; ageRead(personIdentifier, stateStringVariable); } } 事件

事件是从合约中触发的,任何对它们感兴趣的人都可以捕获它们并响应执行代码。 合约中声明的事件再全局域内有效,并且被合约中的函数所调用。使用event关键字声明一个事件,后跟一个标识符和参数列表并以分号结尾。

// event declaration event ageRead(address,string); 枚举

enum关键字用于声明枚举。枚举用于在solidity中声明用户自定义的数据类型。枚举包含一个枚举列表、一组预定义的常量。 在solidity中,枚举中常量值可以显式地转换为整数。每个常量值对应一个整数值,第一个值为0,每个连续项的值增加1。 使用enum关键字声明枚举,后面跟着枚举标识符和花括号{}内枚举值列表。 枚举声明没有分号作为终结符,并且列表中至少应该声明一个成员。 枚举的示例如下:

enum gender {male,female}

可以声明并赋值枚举变量,如下:

gender _gender = gender.male; 函数

函数机制是为了从状态变量读取值和向状态变量写入值。 函数声明语法:

function getAge(address _personIdentifier) onlyBy() payable external returns(uint){ }

使用function关键字后跟其标识符getAge来声明函数。多个参数使用逗号隔开。 函数限定符:

public:函数可以直接从外部访问。是合约接口的一部分。internal:函数只能用于当前合约以及任何从其继承的合约。不能从外部访问。不是合约接口的一部分。private:私有函数只能在声明它们的合约中使用,即使在派生合约中也不能使用它们。不是合约接口的一部分。external:函数可以直接从外部但不是内部访问。是合约接口的一部分。constant:函数不具有修改区块链状态的能力。它们可以读取状态变量并返回给调用者,但不能修改任何变量、触发事件、创建另一个合约、调用其他可以改变状态的函数等。将常函数看作可以读取和返回当前状态变量值的函数。view:这些函数是常量函数的别名。pure:函数既不能读取也不能写入,即它们不能访问状态变量。使用此限定符声明的函数应确保它们不会访问当前变量和交易变量。payable:函数能够接受来自调用者的以太币。如果发送者没有提供以太币,调用将会失败。如果一个函数使标记payable,该函数只能接受以太币。 数据类型

solidity数据类型可以大致分为以下两种类型: 值类型 引用类型

值类型

如果一个类型将数据(值)直接保存在内存中,则称该类型为值类型。值类型在自己的存储空间中保存数值。值类型是大小不超过32字节内存的类型。solidity提供以下值类型:

bool:可以保存true 或者false作为其值的布尔值。uint:无符号整数,只能保存0和正值。int:可以保存负值和正值的有符号整数。address:表示以太坊环境中的账户地址。byte:表示固定大小的字节数组(byte1到bytes32)enum:可以保存预定义的常量值的枚举。

值传递 如果将值类型变量赋给另一个变量,或者将值类型变量作为参数传递给函数,则EVM会创建一个新变量实例并将原始值类型的值复制到目标变量中。这种被称为值传递。更改原始或者目标变量中的值不会影响另一个变量中的值。这两个变量将保持其独立的值,并且它们可以在其他变量不知道的情况下更改值。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3