Solidity 构造函数以及事件 和 修饰符

本文深入探讨了Solidity编程中的关键概念,包括修饰器的使用,如自定义onlyOwner修饰器;构造函数的应用,用于初始化合约变量;合同的继承和重写功能,以及不同级别的可见性,如public、private、external和internal。此外,还介绍了事件在以太坊智能合约中的作用,如日志记录。这些内容对于理解以太坊智能合约的开发至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修饰器 modifier

contract Test {
	adress owner;
	// 自己手写个修改器
	//function OnlyOwner(address _owner) internal {
	//	require(_owner == msg.sedner,'Error')
	//}	
	
	// 官方写法, 可以进行传参  
	// 修改器也是可以进行多个使用的
	modifier onlyOwner(address _owner) {
        require(msg.sender == _owner,'error');
        _;
    }
	function ownerd(address _owner) public onlyOwner(_owner) {
		owner = _owner;
	}
	
}

构造函数

contract Func {
    uint256 public x;
    uint256 public y;
    address public owner;
    uint256 public createAt;
    constructor(uint256 _x, uint256 _y) {
        x = _x;
        y = _y;
        owner = msg.sender;
        createAt = block.timestamp;
    }
}

继承

contract Old {
    string private name;
    // constructor(string memory _name){
    //     name = _name;
    // }
    // pure 对于函数:禁止修改或访问状态。  virtual 允许函数被修改重写
    function getContractName() public pure virtual  returns(string memory){
        return "contract Old";
    }

    function getName() external view returns(string memory){
        return name;
    }

    function editName(string memory _name) external {
        name = _name;
    }
}

// contract Now is Old {
contract Now {
    // // Old(_name) 继承Now的参数
    // constructor (string memory _name) Old(_name) {

    // }
    // override 重写函数标志
    function getContractName() public pure virtual returns(string memory){
        return "contract Now";
    }

}

contract Will is Now, Old {

    function getContractName() public pure override(Now, Old) returns(string memory){
        return "contract Will";
    }

    function getContract() public pure returns(string memory){
        return Now.getContractName();
    }
}

可见性

contract Base {
    // public: visible externally and internally (creates a getter function for storage/state variables)
    // private: only visible in the current contract
    // external: only visible externally (only for functions) - i.e. can only be message-called (via this.func)
    // internal: only visible internally

    function pub() public pure returns(string memory){
        return "public --- This function can be accessed anywhere";
    }

    function pri() private pure returns(string memory){
        return "private Only the current contract or its children can access the function";
    }

    function ext() external pure returns(string memory){
        return "external Cannot be called inside the contract";
    }

    function inte() internal pure returns(string memory){
        return "internal Only callable inside the contract";
    }
}

事件

事件是能方便地调用以太坊虚拟机日志功能的接口。

/**
 *Submitted for verification at Etherscan.io on 2021-12-26
*/

// SPDX-License-Identifier: GPL-3.0
pragma solidity  >=0.7.0 <0.9.0;

contract Event {
	// 日志信息有 sender  和 amount 
    event Log(address indexed sender,uint amount);


    function fn() external {
    	// 触发 log      200表示   200 wei    
    	// 1Eth = 10^18 wei; 
        emit Log(msg.sender, 200);
    }
}
  • 操作结果展示
    在这里插入图片描述

部署合约到测试网并可以在线调试合约教程后续出个文章完善

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李学软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值