打字猴:1.703876434e+09
1703876434 区块链项目开发指南 [:1703875294]
1703876435 区块链项目开发指南 3.2 智能合约的结构
1703876436
1703876437 合约就像一个类(class),其中包含状态变量(state variable)、函数(function)、函数修改器(function modifier)、事件(event)、结构(structure)和枚举(enum)。合约还支持继承,通过在编译时备份代码来实现。最后,合约还支持多态。
1703876438
1703876439 下面来看一个智能合约的例子:
1703876440
1703876441
1703876442
1703876443
1703876444 上述代码的工作原理如下:
1703876445
1703876446 1)使用contract关键字声明一个合约。
1703876447
1703876448 2)声明两个状态变量data和owner。data包含一些数据,owner包含所有者的以太坊钱包地址,即部署合约者的以太坊地址。
1703876449
1703876450 3)定义一个事件(event)。事件用于通知客户端。一旦data发生变化,将触发这个事件。所有事件都保存在区块链中。
1703876451
1703876452 4)定义一个函数修改器(function modifier)。修改器用于在执行一个函数之前自动检测条件。这里,修改器检测合约所有者是否在调用函数。如果不是,就抛出异常。
1703876453
1703876454 5)得到合约构造函数(constructor)。在部署合约时,调用构造函数。构造函数用于初始化状态变量。
1703876455
1703876456 6)定义两个方法。第一个方法用于得到data状态变量的值,第二个方法用于改变data的值。
1703876457
1703876458 在更深入地学习智能合约的函数之前,我们先来学习一些与Solidity有关的其他知识,然后再回到合约。
1703876459
1703876460
1703876461
1703876462
1703876463 区块链项目开发指南 [:1703875295]
1703876464 区块链项目开发指南 3.3 数据位置
1703876465
1703876466 截至目前,我们学过的所有编程语言可能都把变量存储在内存中。但是在Solidity中,根据情况的不同,变量可能不存储在内存和文件系统中。
1703876467
1703876468 根据情况的不同,数据总有一个默认位置。但是对于复杂数据类型,例如字符串(string)、数组(array)和结构类型(struct),可以用向类型添加storage或者memory进行重写。函数参数(包括返回参数)默认用memory,本地变量默认用storage。显然,对于状态变量来说,位置强制用storage。
1703876469
1703876470 数据位置很重要,因为它们会改变分配的行为:
1703876471
1703876472 ·storage变量和memory变量之间的分配总是创建一个独立的备份。但如果分配是从memory存储的一种复杂类型到另一种复杂类型,则不创建备份。
1703876473
1703876474 ·到一个状态变量的分配(即使是来自其他状态变量)总是创建一个独立的备份。
1703876475
1703876476 ·不能把memory中存储的复杂类型分配给本地存储变量。
1703876477
1703876478 ·在分配状态变量给本地存储变量的情况下,本地存储变量指向状态变量,也就是说,本地存储变量变为指针。
1703876479
1703876480
1703876481
1703876482
1703876483 区块链项目开发指南 [:1703875296]
[ 上一页 ]  [ :1.703876434e+09 ]  [ 下一页 ]