solidity基础语法与简单案例20221130

这篇具有很好参考价值的文章主要介绍了solidity基础语法与简单案例20221130。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、Todolist(日程表)练习

包括增删改查和使用地址获取结构体

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract Todolist{
    struct Todo{
        string text;
        bool complete;
    }

    Todo[] public todos;
    
    //构建能够从地址映射构建内容的mapping
    mapping(address=>Todo) public WhoOwnTodo;

    function create(string calldata _text) external{
        Todo memory todo;
        todo.text = _text;
        todo.complete = false;
        todos.push(todo);
        // todos.push(Todo({
        //     text:_text,
        //     complete:false
        // }));
        WhoOwnTodo[msg.sender] = todo;
    }
    function updateText(uint _index,string calldata _text) external{
        //如果仅需要修改结构体中的一个内容:
        todos[_index].text = _text;

        //如果需要修改结构体中的多个内容:        
        // Todo storage todo = todos[_index];
        // todo.text = _text;
        // todo.complete = true;
    }
    //根据索引获取数组
    function get(uint _index) external view returns(string memory,bool){
        
        //将todo装在storage中比装在内存memory中的gas更少。
        Todo storage todo = todos[_index];
        return (todo.text,todo.complete);
    }
    function change_complete(uint _index) external{
        todos[_index].complete = !todos[_index].complete;
    }
    function gettodo(address _addr) external view returns(Todo memory){
        return WhoOwnTodo[_addr];
    }
}

2、事件event

        是用于记录当前智能合约运行状态的方法,体现在区块链浏览器上以及交易记录的log,通过事件可以查询改变过的状态。

        包括构建事件和触发事件。

        事件是写入方法,不能标记为view和pure。

        Log:自定事件        

        IndexedLog:具有索引的事件,可以利用用户地址查询所有用户在区块链上发生过的事情。类似传统数据库的检索,有索引的变量最多只能有三个。

        Message:有from和to地址,该事件具有两个区块链地址。  

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract Event{
    //log是可自定义的事件
    event Log(string message,uint val);
    //据有索引的事件,当索引不同时,值也不同
    event IndexedLog(address indexed sender,uint val);

    function example() external{
        emit Log("foo",1234);
        emit IndexedLog(msg.sender,789);
    }

    //包含从A地址到B地址以及相关信息的事件
    event Message(address indexed _from,address indexed _to, string message);
    function sendMessage(address _to, string calldata message) external{
        emit Message(msg.sender, _to, message);
    }
}

3、继承

合约继承:B is A

合约方法覆写:virtual、override

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

//能够被覆写的函数能需要使用virtual修饰词
contract A{
    function foo() public virtual pure returns (string memory) {
        return"A";
    }

    function bar() public virtual pure returns (string memory) {
        return"A";
    }

    //more code
    function baz() public pure returns (string memory){
        return"A";
    }
}

//在覆写函数的时候需要使用override修饰词
contract B is A{
    function foo() public pure override returns (string memory){
        return"B";
    }
    function bar() public override virtual pure returns (string memory){
        return"B";
    }
}

contract C is B{
    function bar() public override pure returns (string memory){
        return"C";
    }
}

4、多线继承

多线继承是指:

        X

  /      |

Y       |       

  \       |

          Z

Y继承X,Z继承X和Y,这种多重继承关系。

在构建多线继承时,要先梳理继承关系,在新的函数继承时,将继承最少的函数放在最前面,继承最多的函数放在最后面。

并且要在override后添加继承的合约名称

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract X{
    function foo() public pure virtual returns(string memory){
        return "X";
    }
    function bar() public pure virtual returns(string memory){
        return "X";
    }
    function x() public pure returns(string memory){
        return "X";
    }
}

contract Y is X{
    function foo() public pure virtual override returns(string memory){
        return "Y";
    }
    function bar() public pure virtual override returns(string memory){
        return "Y";
    }
    function y() public pure returns(string memory){
        return "Y";
    }
}

contract Z is X,Y{
    function foo() public pure virtual override(X,Y) returns(string memory){
        return "Z";
    }
    function bar() public pure virtual override(X,Y) returns(string memory){
        return "Z";
    }

}

5、继承的构造函数

按照继承的顺序进行构造

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract A{
    string public name;

    constructor(string memory _name){
        name = _name;
    }
}

contract B{
    string public text;

    constructor(string memory _text){
        text = _text;
    }
}

//提前输入固定的内容进行子合约的构造函数设定
contract V is A("A"),B("B"){
}

//通过后续输入信息来传导构造函数
contract VV is A,B{
    constructor(string memory _name,string memory _text) A(_name) B(_text) {
    }
}

contract VVV is A("a"),B{
    constructor(string memory _text) B(_text){

    }
}

6、调用父合约已被重写的函数

可以使用子合约调用已经被重写了的函数。

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract E{
    event Log(string message);

    function foo() public virtual{
        emit Log("E.foo");
    }
    function bar() public virtual{
        emit Log("E.bar");
    }
}

contract F is E{
    function foo() public override{
        emit Log("F.foo");
        E.foo();
    }

    function bar() public override{
        emit Log("F.bar");
        super.bar();
    }
}

7、可视范围

private 仅内部合约可使用,外部和继承合约不可使用

internal 内部合约和继承合约可使用,外部不可使用

public 内部、继承和外部均可使用

external  内部、外部可使用,继承合约不可使用

8、不可变量

immutable:用于函数修饰词,该函数在构建合约时作为变量,以后变为不可修改的常量,用于减少gas。

9、支付ETH

payable:可向合约发布主币文章来源地址https://www.toymoban.com/news/detail-446814.html

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

contract Payable{
    address payable public owner;

    constructor(){
        owner = payable(msg.sender);
    }

    function deposit() external payable{}

    function getBalance() external view returns (uint) {
        return address(this).balance;
    }

}

到了这里,关于solidity基础语法与简单案例20221130的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue中TodoList案例_勾选

    与上一篇Vue中TodoList案例_添加有三个文件变化了 App.vue :中加了checkTodo方法 MyList.vue :中拿到checkTodo,再传给MyItem MyItem.vue: 定义change改变时候触发方法将id传给App.vue 效果 :勾选时候数据动态变化  

    2024年02月16日
    浏览(23)
  • Vue中TodoList案例_本地存储

    App.vue 效果 :数据存储再localStroage中,刷新浏览器保存的数据仍在。   

    2024年02月15日
    浏览(37)
  • 第二十二章 案例TodoList之鼠标事件

    本小节,我们需要使用鼠标事件,给 Item 组件添加背景颜色,并显示删除按钮。 添加鼠标移入和移出事件 主要的改造点: 初始化一个状态数据,用于控制背景颜色和删除按钮 当值为 true 的时候,背景颜色变为灰色,删除按钮显示。为 false 的时候,背景颜色变回白色,删除

    2024年02月08日
    浏览(27)
  • React 入门:实战案例 TodoList Item鼠标悬浮效果

    本文实现鼠标悬浮到 Todo 记录上时的样式,以及悬浮到 Item 组件 UI 上时,显示【删除】按钮,鼠标离开时隐藏【删除】按钮。 本文通过给事件处理来实现。 (如果你对 React 的事件处理不了解,请阅读本专栏前面的【事件处理】章节) onMouseEnter:当鼠标悬浮到某个元素上时

    2024年02月12日
    浏览(23)
  • 用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

    目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项(全)代码 在开发“ToDoList”案例之前,需要先完成一些准备工作,包括创建项目、引入 BootStrap 样式文件和搭建基本项

    2024年04月12日
    浏览(58)
  • 【Python入门篇】——Python中循环语句(while循环的基础语法和基础案例)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句,Python函数,Python的数据容器等。 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 while循环的使用框架

    2024年02月05日
    浏览(46)
  • Blazor简单教程(1.1):Razor基础语法

    Blazor最重要的是Razor组件和cshtml页面。两个最大的区别就是cshtml是完整的html,Razor是不完整的html 微软Razor 语法官方文档 我的Blazor基础语法个人总结 C# Blazor 学习笔记(12):css样式设置 C#小轮子:Visual Studio自动编译Sass文件 Components:组件 Controller:控制器/API Layout:布局 Models:实

    2024年02月13日
    浏览(40)
  • solidity经典案例-----智能投票

    角色分析:包括主持人、选民 功能分析: 仅主持人能授权给每个选民1票,即每个参与投票的选民拥有1票投票权。 选民可以选择将票数委托给其它选民,当然,收委托的选民仍然可以将票数继续委托给其它选民,即存在a—b–c–d,但是,一旦将票数委托给其它选民后,自己

    2024年01月16日
    浏览(35)
  • solidity案例详解(六)服务评价合约

     有服务提供商和用户两类实体,其中服务提供商部署合约,默认诚信为true,用户负责使用智能合约接受服务及评价,服务提供商的评价信息存储在一个映射中,可以根据服务提 供商的地址来查找评价信息。用户评价信息, 服务提供商的评价信息会随之更新。服务提供商查

    2024年02月03日
    浏览(26)
  • 【python】Python基础语法详细教程以及案例教学之 while循环语句、while语句嵌套应用、for循环语句、for语句嵌套应用、循环中断

    目录  前言 一、while循环的基础语法  1)什么是while语句?  2)如何具体实现while语句? 二、while循环的基础案例 1)案例一:  2)案例二: 三、while循环的嵌套应用 1)学习目标: 2)什么是while循环的嵌套 3)如何实现while嵌套? 四、while循环的嵌套案例 1)学习目标 2)补充

    2024年01月25日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包