智能合约笔记整理(一、二)

智能合约(一)

bytes用来存储任意长度的字节数据,string用来存储任意长度的

(UTF-8编码)的字符串数据。

balance用来查询账户余额,transfer()用来发送以太币(以wei为单

位)。

一、数据类型

1、布尔类型(bool) true  false

2、整形  

int/uint: 表示有符号和无符号不同位数整数。支持关键字uint8到uint256 (以8步进),

uint 和 int 默认对应的是 uint256 和 int256。

整数除法总是截断的,但如果运算符是字面量(字面量稍后讲),则不会截断。

3、 定长字节数组 

关键字有:bytes1, bytes2, bytes3, ..., bytes32。(以步长1递增)

byte代表bytes1。

bytes用来存储任意长度的字节数据,string用来存储任意长度的(UTF-8编码)的字符串数据。

如果长度可以确定,尽量使用定长的如byte1到byte32中的一个,因为这样更省空间。

字符串常量与整数常量

注意:

定长字节数组:byte[7] aa  = [byte(0x11),0x11,0x11,0x11,0x11,0x11,0x11];

变长字节整数:byte[] cc = new byte[](10);

存储在内存中的无论是定长还是变长都不能改变长度

4、十六进制常量

以关键字hex开头  如 hex"001122ff"

5、字符串常量

不可以用下标访问其中的某个字符,但可以通过将其转换为bytes数组形式访问。

6、枚举类型

在Solidity中,枚举可以用来自定义类型。它可以显示的转换与整数进行转换,但不能进行隐式转换。枚举至少应有一个成员。

7、地址类型 address

20字节

地址类型成员:

balance 属性及transfer() 函数这里是地址类型相关成员的快速索引balance用来查询账户余额,transfer()用来发送以太币(以wei为单位)

send()函数:

send 与transfer对应,但更底层。如果执行失败,transfer不会因异常停止,而send会返回false

call()函数:返回一个bool值 , 参数为:

 id = keccak256(�这里面是函数�)这样就可以生成函数id,然后就可以使用对应合约类的地址.call(第一参数是上面获取的id,以后的参数就是函数的参数)

匿名函数:

一个合约可以有一个匿名函数。此函数不能有参数,也不能有任何返回值。当我们企图去执行一个合约上没有的函数时,那么合约就会执行这个匿名函数。

此外,当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下只会消耗很少的gas,所以当你接受到以太币后,想要执行一些操作的话,你尽可以把你要的操作写到这个匿名函数里,因为这样做成本非常便宜。

function() public payable{}

构造函数先初始化,再调用构造函数

五、访问器函数

创建的状态变量为public时(uint public data = 10;),

会自动创建get函数 function data() external {}

只能以external方式访问

2、枚举访问器与上述访问方式相同

3、数组访问器 this.array(1) ;  要用小括号

4、映射访问器  带有参数 参数为键类型的

Mapping(uint => uint) public data ;

this.data(20);   20为键

5、结构体访问器  需要用变量接受结构体中的所有变量

var(a,b,c) = this.s();

Return (a,c);

智能合约(二)

memory  : 内存中,数据不是永久存在

storage  : 永久存贮在区块链中


memory 数组  不能改长度 无论是bytes 还是 uint

storage 可变数组  可以修改长度  无论是bytes 还是 uint


一、存储位置分析

1、数据位置

storage(永远存储在区块链中):引用类型,局部复杂变量(数组,数据结构)

状态变量

memory(内存中,不是永久存在):函数参数,简单局部变量

calldata(不会永久存储的一个数据位置):外部函数参数,不包括返回参数只是读的


storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组

memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用

注意:

不能将memory 赋值给复杂局部变量。(不明白)

对于值类型,总是会进行拷贝。

一个storage的状态变量,赋值给一个storage的局部变量,是通过引用传递。所以对于局部变量的修改,同时会修改关联的状态变量。

将一个memory 的引用类型赋值给另一个 memory 的引用,不会创建拷

贝(即:memory 之间是引用传递)。

三种存储方式内存消耗

storage 会永久保存合约状态变量,开销最大

memory 仅保存临时变量,函数调用之后释放,开销很小

stack 保存很小的局部变量,几乎免费使用,但有数量限制。

二、数组的使用

初始化数组:

uint [] public u = [1,2,3];

uint[] memory m = new uint[](10);

Length:数组可以指定长度也可以是动态变长。

Data:数据类型可以是任意的

数组作为构造函数参数时:

如:bytes8[] _name  传参:["0x12","0x23","0x45"]

bytes与string区别:bytes提供length与set数据  而string不提供

三、结构体及映射

结构体内数据类型可以是任意的,也可以是结构体类型的,即支持结构体嵌套

初始化:

Add memory add = Add("beijing");

     Person memory p1 = Person("List",30,add); //结构体不能用new

访问:p1.age = 40 ; //直接使用 . 访问 

四、solidity常见单位

1、货币单位: 1 ether , 3 finney , 6 szabo , 18 wei ,

2、时间单位:secounds,minutes ......  now:表示现在距1970 多久

五、常见的API介绍

错误处理:

1、assert(bool condition)

用于判断内部错误,条件不满足时抛出异常

2、require(bool condition):  (常用)

用于判断输入或外部组件错误,条件不满足时抛出异常

3、revert():

终止执行并还原改变的状态


<<以下内容能记住就记住,记不住就看看>>


数学及加密功能

1、addmod(uint x, uint y, uint k) returns (uint):

计算(x + y) % k,加法支持任意的精度且不会在2**256处溢出,从

0.5.0版本开始断言k != 0。

2、mulmod(uint x, uint y, uint k) returns (uint):

计算(x * y) % k, 乘法支持任意的精度且不会在2**256处溢出,

从0.5.0版本开始断言k != 0。

3、keccak256(...) returns (bytes32):

使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。

4、sha256(...) returns (bytes32):

使用SHA-256计算hash值,紧密打包参数。

5、sha3(...) returns (bytes32):

keccak256的别名

6、ripemd160(...) returns (bytes20):

使用RIPEMD-160计算HASH值。紧密打包参数。

7、ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns

(address):

通过椭圆曲线签名来恢复与公钥关联的地址,或者在错误时返回零。

可用于签名数据的校验,如果返回结果是签名者的公匙地址,那么说明数

据是正确的。

地址相关

1、 balance (uint256):

Address的余额,以wei为单位。

2、 transfer(uint256 amount):

发送给定数量的ether到某个地址,以wei为单位。失败时抛出异常。

3、send(uint256 amount) returns (bool):

发送给定数量的ether到某个地址,以wei为单位, 失败时返回false。

4、 call(...) returns (bool):

发起底层的call调用。失败时返回false。

5、callcode(...) returns (bool):

发起底层的callcode调用,失败时返回false。

不鼓励使用,未来可能会移除。

6、 delegatecall(...) returns (bool):

发起底层的delegatecall调用,失败时返回false

合约相关

 1、this(当前合约的类型):

表示当前合约,可以显式的转换为Address

2、selfdestruct(address recipient):

销毁当前合约,并把它所有资金发送到给定的地址。

3、suicide(address recipient):

selfdestruct的别名

另外,当前合约里的所有函数均可支持调用,包括当前函数本身。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容