本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.对于length,只有数组才可以使用,如果是mapping是不能用的
2.uint定义szabo这种好像也是没法定义,可以使用1e12来代表(10^12)
3.处理返回struct--->
1.读取storage里的struct,然后以struct memory返回值
2.如果在returns中写的是calldata,代表其是只读的,不能修改,返回值最好写的是memory吧
4.transfer\send\call
transfer与send相似,都为转账操作
transfer出错抛出异常
send、call出错不抛出异常,返回true或false
tansfer相对send更安全
send、call即便转账失败也会执行其后的代码
慎用call函数转账,容易发生重入攻击。
5.关于remix的import
如果一下子import没有成功,建议等一下再试试看
在 Solidity 中导入和加载源文件
将外部文件加载到 Remix 有两个主要原因:
- 导入库或依赖项(对于您不会编辑的文件)
- 加载一些文件进行操作、编辑和播放(对于您可能想要编辑的文件)
导入库或依赖项
1.从
NPM 或 URL(如 github、IPFS 网关或 Swarm 网关)导入时,您只需使用import合约中的语句即可。在编译合约之前,不需要将依赖项“预加载”到文件资源管理器的当前工作区中。2.从导入语句加载的文件放置在文件资源管理器的当前工作区
.deps文件夹中。或者直接通过./***.sol导入不在.deps的文件3.
在后台,Remix 会检查文件是否已加载到.deps目录中。如果不是,如果它是 NPM 库,它会通过 unpkg 获取它们。
6.如果使用import之后的合约中的类型,没有办法直接使用的,必须要继承才可以
contract B {
struct Player {
uint id;
}
mapping (uint=> Player) public Players;
}
contract A is B {
constructor() public {
B.Player storage p = B.Players[1];
}
}
或者是
直接做一个复制可以吗?
答案是不行,因为solidity没有办法跨越这个文件对struct进行识别,有点傻(可能是我不知道怎么做?到底是它傻还是我傻