本文仅为个人学习过程中的记录,如有内容不足请留言,我会及时添加,并不是一个Solidity教程,Solditiy教程可前往Solidity教程
Solidity是一种类似Javascript的高级语言。它被设计成以编译的方式生成以太坊虚拟机的代码
contract SimpleStorage {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
这是一段最简单的Solidity合约,声明了一个变量storedData,以及一个set一个get两个方法去进行读写。Solidity中访问变量不需要this关键字
Solidity的合约的定义与面向对象语言的类的定义有些相似。每个合约包括了状态变量,函数,函数修饰符,事件,结构类型和枚举类型,且合约也能从其他合约那里继承。
- 状态变量是在合约存储器中永久存储的值
- 函数是合约中可执行单位的代码
- 函数修饰符可以在声明中补充函数的语义
- 事件是和evm日志设施的方便接口
- 结构类型是一组用户定义的变量
- 枚举是用来创建一个特定值的集合类型
Solidity是一种静态语言,也就是说每个变量在编译的时候必须要定义类型。Solidity还支持通过组合提供的几种简单类型构建复杂类型。
与其他语言一样布尔类型的值就是真或假,支持的操作符有!,&&,||,==,!=
整型分int以及uint,其中支持长度为8-256,步长为8,即存在uint8,uint16….uint256
另外int = int256 uint=uint8
支持的操作符有<=,>=,==,<,>,!=,&,|,^,~,+,-,*,/,%,**,+=,-=
地址即Ethereum地址,也可以拥有成员,长度为20字节,是所有合约的base
支持的操作符 <=,>=,>,<,==,!=
十六进制字符串凡是通过地址合法性验证就会被认为是地址。需要注意的是39到41位长的没有通过地址合法性验证 的会得到一个警告,但会被视为普通的有理数字面量
地址的成员有balance以及send,即账户余额以及发送
如果想要获得当前合约的balance可以直接通过this.balance来获取,因为对于合约来说,地址代表的就是合约本身,合约对象默认继承自地址对象
地址有一个send方法用来向某个地址发送货币(货币单位为wei),需要注意的是:
- 调用递归的深度不能超过1024
- 如果gas不够,执行会失败
- 执行该操作需要判断是否成功
bytes1…bytes32,允许值以1为步长递增,byte默认表示byte1
支持的操作符<=,<,>=,>,==,!=,&,|,^,~以及序号访问
字节数组存在一个成员变量length,表示这个字节数组的长度,且只读
小数还未被完全支持,可以被定义但不能被引用或传递
小数分为fixed以及ufixed,有符号小数与无符号小数
支持操作符<=,<,>=,>,==,!=,+,-,*,/,%,+=,-+等操作符
由hex关键字打头,后面紧跟单引号或双引号字符串,内部会被表示成二进制流
由于一个字节为8位,因此一个hex是由两个[0-9a-f]字符组成的
hex可以隐式转为bytes
可以将一个函数赋值给一个变量,一个函数类型的变量,还可以将函数作为参数进行传递,也可以在函数调用中返回一个函数。该类型分为两类:internal以及extrnal
internal只能在当前合约的上下文环境意外的地方执行
external包括地址与函数方法签名两部分,可作为外部函数调用的参数或有外部函数返回
完整的函数定义:
默认函数为internal
如果没有返回值则必须省略returns
function (<parameters types>){internal|external}[constant][payable][returns () ]
数组声明时可以是变长的也可以指定长度,对于storage数组来说元素类型可以是任意的,而对于memory数组来说,如果函数对外可见,那么函数参数不能是映射类型,只能支持ABI类型
声明多维数组时,solidity的长度声明与其他语言是相反的,例如我声明一个长度为5的二维数组,每个元素是变长数组,那么我的声明应是uint[][5] x
类型为数组的状态变量可以标记public类型,从而让Solidity来构造一个访问器
变长数组可以通过修改length来调整数组长度
在eth中调用方法进行写操作时使用sendTransaction来请求,且需要在参数中写入操作账户以及gas,读操作使用call,并且执行完写操作之后需要进行一次挖矿将数据保存。
contract.funcName.sendTransaction(args...,{from:eth.accounts[0],gas:200000})