Solidity实战补盲(一)

410 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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没有成功,建议等一下再试试看

Image.png 在 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进行识别,有点傻(可能是我不知道怎么做?到底是它傻还是我傻