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的值。
猜您想看
-
一名合格的SEO需要做的事情有哪些
一、研究行业竞...
2023年05月26日 -
互联网中手机为什么信息发不出去并显示发送失败
一、手机信息发...
2023年07月23日 -
openstack dasboard使用的是什么语言以及如何搭建开发环境和本地化
1.OpenS...
2023年05月25日 -
如何在Steam上找到并下载游戏配乐和原声音效?
如何在Stea...
2023年05月13日 -
C++怎么实现数字取整
一、C++实现...
2023年05月26日 -
如何在PHP中使用Markdown进行文档处理
PHP中使用M...
2023年05月05日