public private external internal, 这四个是对函数访问的修饰符,以前我是一律用public,这个方便,不用费脑筋。后来随着开发地深入,最佳的方案显然不是public,而是private external这两个。
public - 任意访问
private - 仅当前合约内
internal - 仅当前合约及所继承的合约
external - 仅外部访问(在内部也只能用外部访问方式访问)
当使用public 函数时,Solidity会立即复制数组参数数据到内存, 而external函数则是从calldata读取,而分配内存开销比直接从calldata读取要大的多。
那为什么public函数要复制数组参数数据到内存呢?是因为public函数可能会被内部调用,而内部调用数组的参数是当做指向一块内存的指针。
对于external函数不允许内部调用,它直接从calldata读取数据,省去了复制的过程。
所以,如果确认一个函数仅仅在外部访问,请用external。
当需要内外部都要调用的时候,请用public。
public 、external
都可以访问,都可以继承
但是external内部不能访问,除非带上this
private 、internal
只能内部访问,private不可继承,internal可以继承
所以,现在我是一般以最小化函数访问权限来设计。如果只是合约内部访问,就只用private, 如果只是外部调用,则只用external。没有过多的权限,也不浪费gas,一切都是刚刚好!