1703876794
2.抽象合约
1703876795
1703876796
仅包含函数原型而不包含函数实现的合约称为抽象合约(abstract contract)。这些合约不能被编译(即使包含实现函数和非实现函数)。如果一个合约继承自抽象合约且不重写并实现所有非实现函数,那么它自己也是抽象的。
1703876797
1703876798
抽象合约仅在创建编译器已知的接口时提供。这在引用已部署的合约和调用其函数时是很有用的。示例如下:
1703876799
1703876800
1703876801
1703876802
1703876803
1703876804
1703876805
1703876807
区块链项目开发指南 3.10 库
1703876808
1703876809
库类似于合约,但其目的是在一个特定地址只部署一次,且其代码由不同合约反复使用。这意味着如果调用库函数,其代码在调用合约(calling contract)中执行,也就是说,this指向调用合约,特别是来自调用合约的storage可以被访问。由于库是源代码中独立的一部分,它只能访问调用合约的状态变量,如果这些变量是显式的(否则无法命名这些变量)。
1703876810
1703876811
库没有状态变量——它们不支持继承,也不能接收以太币。库可以包含结构类型(struct)和枚举类型(enum)。
1703876812
1703876813
一旦在区块链中部署Solidity库,任何知道其地址和源代码(只知道原型或者知道完整实现)的人都可以使用它。Solidity编译器需要有源代码,这样能确保所欲访问的方法在库中真实存在。示例如下:
1703876814
1703876815
1703876816
1703876817
1703876818
不能在合约源代码中添加库地址,而是需要在编译时向编译器提供库地址。
1703876819
1703876820
库有许多使用示例。两个主要的示例如下:
1703876821
1703876822
·如果有许多合约,它们有一些共同代码,则可以把共同代码部署成一个库。这将节省gas,因为gas也依赖于合约的规模。因此,可以把库想象成使用其合约的基础合约。使用基础合约(而非库)切分共同代码不会节省gas,因为在Solidity中,继承通过复制代码工作。由于库被当作基础合约,库里面带有内部可视性的函数被复制给使用它的合约;否则,库里面带有内部可视性的函数不能被使用这个库的合约调用,因为这需要外部调用,而带有内部可视性的函数不能通过外部调用被调用。此外,库里的structs和enums被复制给使用这个库的合约。
1703876823
1703876824
·库可用于给数据类型添加成员函数。
1703876825
1703876826
1703876827
如果一个库里只包含内部函数和/或structs/enums,则不需要部署库,因为库里面的所有内容都被复制给使用它的合约。
1703876828
1703876829
using for
1703876830
1703876831
using A for B这条指令可用于连接库函数(从库A到任意类型B)。这些函数将被调用的对象作为它们的第一个参数接收。
1703876832
1703876833
using A for*的结果表示来自库A的函数被连接到所有类型。示例如下:
1703876834
1703876835
1703876836
1703876837
1703876838
1703876839
1703876840
1703876841
1703876842
1703876843
[
上一页 ]
[ :1.703876794e+09 ]
[
下一页 ]