📜  在 Solidity 中创建可拥有的合约

📅  最后修改于: 2022-05-13 01:54:27.612000             🧑  作者: Mango

在 Solidity 中创建可拥有的合约

智能合约(或加密合约)是一种在特定条件下直接自动控制双方数字资产转移的计算机程序。一旦部署,智能合约代码就无法更改。它也对所有人公开可见。
Solidity 是一种用于创建智能合约的语言,然后将其编译为字节码,然后将其部署在以太坊网络上。即使代码是公开可见的,也可以使用修饰符来限制函数的调用。
Solidity 默认提供了一些访问修饰符:

  1. 公开 -任何人都可以访问
  2. 私有 -只能通过定义它们的合约访问,而不能通过继承合约访问。
  3. 受保护 -只能由定义它们的合约和继承它们的合约访问。
  4. 内部 -只能由合同的其他功能访问,而不能由其他人或合同访问。
  5. 外部 -只能由其他人或合同访问,而不能由功能访问。

可拥有合同的需要:
某些功能仅用于配置目的或一次性计算。这些功能如果公开暴露,可能会被恶意或错误地用于排气。为了防止误用或降低 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

输出#1

尝试从非所有者地址调用calculateSum() (不成功):



输出#2

以所有者身份调用calculateSum() (成功):

输出#3