在 Solidity 中创建可拥有的合约
智能合约(或加密合约)是一种在特定条件下直接自动控制双方数字资产转移的计算机程序。一旦部署,智能合约代码就无法更改。它也对所有人公开可见。
Solidity 是一种用于创建智能合约的语言,然后将其编译为字节码,然后将其部署在以太坊网络上。即使代码是公开可见的,也可以使用修饰符来限制函数的调用。
Solidity 默认提供了一些访问修饰符:
- 公开 -任何人都可以访问
- 私有 -只能通过定义它们的合约访问,而不能通过继承合约访问。
- 受保护 -只能由定义它们的合约和继承它们的合约访问。
- 内部 -只能由合同的其他功能访问,而不能由其他人或合同访问。
- 外部 -只能由其他人或合同访问,而不能由功能访问。
可拥有合同的需要:
某些功能仅用于配置目的或一次性计算。这些功能如果公开暴露,可能会被恶意或错误地用于排气。为了防止误用或降低 gas 成本,此类功能必须仅限于选定的外部地址(为简单起见,所有者)。为了解决这个问题,可以使用可拥有的合约。
以下是可拥有合约的代码。它可以被其他合约继承,这些合约打算为选定的功能拥有可拥有的修饰符。
以下是上述方法的 Solidity 程序:
Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0;
contract Ownable
{
// Variable that maintains
// owner address
address private _owner;
// Sets the original owner of
// contract when it is deployed
constructor()
{
_owner = msg.sender;
}
// Publicly exposes who is the
// owner of this contract
function owner() public view returns(address)
{
return _owner;
}
// onlyOwner modifier that validates only
// if caller of function is contract owner,
// otherwise not
modifier onlyOwner()
{
require(isOwner(),
"Function accessible only by the owner !!");
_;
}
// function for owners to verify their ownership.
// Returns true for owners otherwise false
function isOwner() public view returns(bool)
{
return msg.sender == _owner;
}
}
contract OwnableDemo is Ownable
{
uint sum = 0;
uint[] numbers;
// Push number to array
function addNumber(uint number) public
{
numbers.push(number);
}
// Read sum variable
function getSum() public view returns(uint)
{
return sum;
}
/*
Calculate sum by traversing array
The onlyOwner modifier used here prevents
this function to be called by people other
than owner who deployed it
*/
function calculateSum() onlyOwner public
{
sum = 0;
for(uint i = 0;
i < numbers.length; i++)
sum += numbers[i];
}
}
输出:
从任何地址添加数字(所有者与否无关紧要):
该函数被调用三次,参数分别为:5、6 和 2
尝试从非所有者地址调用calculateSum() (不成功):
以所有者身份调用calculateSum() (成功):