Solidity函数的external/internal,public/private区别是什么
Solidity是一门面向智能合约开发的编程语言,用于在以太坊虚拟机(Ethereum Virtual Machine, EVM)上编写智能合约。在Solidity中,函数可以声明为external、internal、public、private等不同的可见性修饰符,在合约中的访问和调用权限有所不同。下面将详细介绍这些修饰符的区别。
1. external
在Solidity中,external修饰符用于指定函数只能被外部地址调用,即只能从合约外部通过消息调用的方式访问函数。这意味着该函数不能在合约内部被调用,也不能在其他合约中或合约继承关系中被访问。外部函数只能被外部调用者通过交易调用,而不能被其他合约内部的函数或者合约自身通过函数调用的方式访问。例如:
contract MyContract {
function foo() external returns(uint) {
return 42;
}
}
在上面的例子中,函数foo被声明为external,只能通过消息调用的方式从合约外部进行访问。
2. internal
internal修饰符用于指定函数只能被当前合约和合约继承关系中的合约调用,即只能在当前合约及其子合约中被访问。internal函数在外部是不可见的,即不能通过消息调用或外部地址直接访问。例如:
contract MyContract {
function foo() internal returns(uint) {
return 42;
}
}
contract MyChildContract is MyContract {
function bar() public {
uint result = foo();
}
}
在上面的例子中,函数foo被声明为internal,只能在当前合约及MyContract的子合约MyChildContract中被调用。函数bar通过调用foo函数来获取结果。
3. public
public修饰符是Solidity中函数默认的可见性修饰符,也是使用最广泛的修饰符。函数声明为public时,可以被任何地址调用,包括合约内部和外部。同时,函数的定义和状态变量也会自动生成一个getter函数,用于实现对函数的访问。例如:
contract MyContract {
uint public myVariable;
function foo() public returns(uint) {
return myVariable;
}
}
在上面的例子中,myVariable是一个公共状态变量,通过声明为public,Solidity会自动生成一个名为myVariable的getter函数,用于获取这个变量的值。同时,函数foo中也使用了public修饰符,可以被任何地址调用。
4. private
private修饰符用于指定函数只能被当前合约内部其他函数调用,不能被合约外部地址或其他合约访问。private函数不会生成getter函数,因为它只能在合约内部被访问。例如:
contract MyContract {
uint private myVariable;
function foo() private returns(uint) {
return myVariable;
}
function getValue() public returns(uint) {
return foo(); // 可以在合约内部调用private函数
}
}
在上面的例子中,myVariable是一个私有状态变量,只能在当前合约内部访问。函数foo被声明为private,只能在合约内部被调用。函数getValue是一个公共函数,通过调用私有函数foo来获取myVariable的值。
猜您想看
-
如何在 Typecho 博客程序中设置博客运行环境
如何在 Typ...
2023年04月15日 -
OSS JavaScript客户端是怎样的
1、什么是OS...
2023年05月25日 -
如何使用Steam的游戏截图和视频录制功能来记录游戏体验?
如何使用Ste...
2023年05月13日 -
如何快速清理苹果手机的通知中心?
如何快速清理苹...
2023年04月27日 -
Java对象中新生代进入老年代的方式有哪些
引言:在Jav...
2023年07月21日 -
elasticsearch7.x中的IDF该怎么调试
1.什么是ID...
2023年05月25日