映射(Mapping)和地址(Address)
以太坊区块链是由_account_(账户)组成的,每个账户都有自己唯一的地址,也是账户唯一的标识符。
0x6689b8FDe10b6585E79EAd893c151Fe001D26eb8
这是笔者自己的以太坊钱包地址,如果我的文章对你有所帮助,不妨打赏我一些以太:)
除了结构体和数组之外,映射是另一种在Solidity中存储有组织数据的方法。
映射的定义
msg.sender
在Solidity中,有一些全局变量可以被所有函数调用,其中一个就是msg.sender,它指的是当前调用者(或智能合约)的address。
Tips:在 Solidity 中,功能执行始终需要从外部调用者开始。
一个合约只会在区块链上什么也不做,除非有人调用其中的函数。所以 msg.sender总是存在的。
使用msg.sender更新mapping
在Solidity中使用msg.sender是安全的,它具有以太坊区块链的安全保障,除非窃取与以太坊地址相关联的私钥,否则没有办法修改其他人的数据。
require
require能够使函数在执行过程中当不满足某些条件时抛出错误并停止执行,所以在调用函数前用require验证前置条件是非常有必要的。
继承(Inheritance)
当代码过于冗长时,可以通过将代码和逻辑分拆到多个不同的合约中便于管理。合约inheritance(继承)就能够让Solidity的代码易于管理。
合约inheritance(继承)示例
如图所示,BabyDoge从Doge继承,也就意味着BabyDoge被编译和部署后可以访问在Doge中定义的公共函数。
引入(Import)
当代码被分成多个文件管理时,我们可以通过import将一个文件导入另一个文件。
Storage与Memory
在Solidity中,有两个地方可以存储变量——storage和memory。Storage变量指永久存储在区块链中的变量,memory则是临时的,可以联想存储在电脑的硬盘或RAM中数据的关系。默认情况下Solidity会自动处理它们。
状态变量(在函数之外声明的变量)默认存储为“storage”,并永久写入区块链;而在函数内部声明的变量则是“memory”,会在它们的函数调用结束后消失。
Tips:在处理函数内的结构体和数组时也许会需要手动声明存储类型。
internal和external
除了public和private属性之外,Solidity还使用了另外两个描述函数可见性的修饰词:internal和external。
internal和private类似,不过如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“internal”函数。
external与public类似,只不过这些函数只能在合约之外调用,它们不能被合约内的其他函数调用。
声明internal和external类型的函数
通过interface(接口)与其他合约交互
接口与函数类似,但是接口并没有用大括号({})定义函数体,而是用分号(;)结束了函数声明,编译器通过这些特征辨别接口。通过使用接口,合约就能知道其他合约的函数是什么样的,应该怎样调用,以及可以获得什么类型的返回值。
Leave a Reply