映射(Mapping)和地址(Address)

映射_ 是另一种在 Solidity 中存储有组织数据的方法。

//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中:mapping (address => uint) public accountBalance;//或者可以用来通过userId 存储/查找的用户名mapping (uint => string) userIdToName;

映射本质上是存储和查找数据所用的键-值对。在第一个例子中,键是一个 address,值是一个 uint,在第二个例子中,键是一个uint,值是一个 string。

msg.sender

有一些全局变量可以被所有函数调用。 其中一个就是 msg.sender,它指的是当前调用者(或智能合约)的 address

require

require使得函数在执行过程中,当不满足某些条件时抛出错误,并停止执行

合约 inheritance (继承):

contract Doge {function catchphrase() public returns (string) {return "So Wow CryptoDoge";}}contract BabyDoge is Doge {function anotherCatchphrase() public returns (string) {return "Such Moon BabyDoge";}}

合约 inheritance (继承)

由于 子集 是从 父集 那里 inherits (继承)过来的。 这意味着当你编译和部署了 父函数,它将可以访问 父函数 和 子函数和其他我们在 父集 中定义的其他公共函数。

这可以用于逻辑继承(比如表达子类的时候,Cat 是一种 Animal)。 但也可以简单地将类似的逻辑组合到不同的合约中以组织代码。

引入(Import)

在 Solidity 中,当你有多个文件并且想把一个文件导入另一个文件时,可以使用 import 语句:

import "./someothercontract.sol";contract newContract is SomeOtherContract {}

存储变量 —— storage 或 memory

Storage 变量是指永久存储在区块链中的变量。
Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。
大多数时候你都用不到这些关键字,默认情况下 Solidity 会自动处理它们。 状态变量(在函数之外声明的变量)默认为“存储”形式,并永久写入区块链;而在函数内部声明的变量是“内存”型的,它们函数调用结束后消失。

然而也有一些情况下,你需要手动声明存储类型,主要用于处理函数内的 _ 结构体 _ 和 _ 数组 _ 时, 一般这时solidty会提示;

更多关于函数可见性:internal(内部) 和 external(外部)

父集中的private函数在子集中不可见;
另外两个描述函数可见性的修饰词:internal(内部) 和 external(外部)
internal 和 private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。
external 与public 类似,只不过这些函数只能在合约之外调用 – 它们不能被合约内的其他函数调用。
声明函数 internal 或 external 类型的语法,与声明 private 和 public类 型相同