Solidity学习笔记

本文仅为个人学习过程中的记录,如有内容不足请留言,我会及时添加,并不是一个Solidity教程,Solditiy教程可前往Solidity教程

什么是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 (<return types>)]
数组

数组声明时可以是变长的也可以指定长度,对于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})

反馈与建议

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值