【0基础】学习solidity开发智能合约-初识solidity

2023-11-18

本篇课程开始,我们来学习一下如何使用solidity开发智能合约,由于博主对于solidity的学习,也是自学的,所以一些不足或有纰漏之处还望指出,大家共同进步,本系列课程会分很多节课讲述,从入门到进阶、实战,在课程最后,我们会通过所学知识来搭建几个不同类型的智能合约如Token合约、NFT合约等等,感兴趣的小伙伴加个关注吧。

一、什么是智能合约

这里引用一段摘自网络的话语来解释一下 

智能合约是区块链中四大核心技术之一,这个概念最开始是在1994年,由知名密码学家尼克·萨博提出的,可由于技术以及其他的一些原因一直都没有落地,哪怕到了今天,智能合约已经在互联网中很多的应用,比如自动还款,无人机售货等等,也多是局限在个人和机构之间的智能合约,个人和个人之间的智能合约几乎没有,原因就在于“信任”问题,我们会发现,只要谈起合约,大多数都是陌生人跟陌生人之间有这种需求,而且还跟钱有关系,如果在没有第三方做担保的情况下我们之间做了个约定,我把钱打给你,结果你毁约了,不承认怎么办?所以智能合约一直没办法在个人与个人之间普及,后来随着区块链的出现,人们发现,区块链与智能合约十分的契合,因为区块链的很多特点,比如去中心化,数据的不可篡改等,可以从技术的角度,去解决陌生人之间的信任问题,这才使智能合约大规模的应用成为可能,这一阶段的开始以以太坊的诞生为标志。在区块链的基础上,以太坊应用了智能合约技术。智能合约使得以太坊可以实现更多功能,智能合约是一个非常重要的应用,于是,慢慢的,智能合约就成了区块链的核心技术之一。 

总结来说,智能合约就是一个写好的程序脚本,它会在一个虚拟机上运行,且不受外界的干扰,所以能保证最大化的公平、公正、公开性。

以太坊作为区块链2.0的代表,它的设计理念和底层系统设计,让它逐渐被大众所认可,从现在开始我们就准备在以太坊上进行智能合约的开发(你可能听过bsc、trc、matic 等等区块链,它们都是基于以太坊虚拟机EVM开发的区块链网络,所以在以太坊上编写的智能合约,在这些网络上均可以使用)

二、什么是solidity

solidity是用于实现智能合约的一种面向合约的高级编程语言,solidity受到C++、Python和JavaScript的影响,被设计为可运行在以太坊虚拟机(EVM)上,所以用户无需担心代码的可移植性和跨平台等问题。solidity是一种静态类型的语言,支持继承、库引用等特性,并且用户可自定义复杂的结构类型。

 三、合约文件

一个简单的合约文件大概如下图所示:

我们来看一段示例代码,里面有一些简单的注释,可以结合着查看

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;  //solidity编译版本声明

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";  //第三方文件引入

//合约声明
contract DemoToken is ERC20 {
    address owner; //地址变量
    uint256 total = 5000000 * 10**18; //数字变量

    //构造器
    constructor() ERC20("demoToken", "DT") {
        owner = msg.sender;
        _mint(msg.sender, total);
    }

    //方法
    function getTotal() public view onlyOwner returns (uint256) {
        return total;
    }

    //修饰符
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
}
  • 首先,第一行表示代码许可说明,可选项很多,大家可以自行查询
// SPDX-License-Identifier: MIT
  •  第二行声明了我们编译合约代码的solidity版本,其中^表示最低版本为0.8.17,当前该合约也不会被0.9.0以上版本编译
pragma solidity ^0.8.17;  //solidity编译版本声明
  • 第三行,我们引入了一个其他合约文件,solidity里允许我们引用其他的合约文件,这个暂时先不展开讲解,后面课程里我们会具体说明,大家先有个印象即可
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";  //第三方文件引入
  •  第四行,我们声明了一个合约对象,它是以 contract开头的结构 (is ERC20 表示继承了ERC20合约,后面详细讲解)
contract DemoToken is ERC20 {
  • 第五、六行,我们定义了两个变量,关于solidity的变量类型,下一章我们会仔细讲解
    address owner; //地址变量
    uint256 total = 5000000 * 10**18; //数字变量
  • 然后我们声明了一个结构体,它在合约部署的时候会调用,我们可以在里面写一些初始化逻辑,如变量赋值、方法调用等
constructor() ERC20("demoToken", "DT") {
        owner = msg.sender;
        _mint(msg.sender, total);
    }
  •  接着,我们声明了一个函数,仔细看它的声明语法有点类似JavaScript,但是后面一些地方却与JavaScript又有一些不同,它多了一些 public、view 等字段(关于这些多出来的字段,后面也会进行详细介绍)
 //方法
    function getTotal() public view onlyOwner returns (uint256) {
        return total;
    }
  •  最后,我们定义了一个修饰符,它在合约里可以说是有着举足轻重的地位,在这里大家有个印象即可,在后面的课程里都会一一介绍
  //修饰符
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

通过本节课程的学习,我们先是简单了解了智能合约的概念,接着又对一个智能合约的组成部分进行了简单的分析,让我们对智能合约有了一个基本的概念,下一节课,我们将要学习一下solidity里的变量类型有哪些

 更多web3、区块链技术和前沿资讯,请关注公众号:外柏叁布道者(web3_preacher

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【0基础】学习solidity开发智能合约-初识solidity 的相关文章

  • DBSCAN点云聚类

    1 DBSCAN算法原理 DBSCAN是一种基于密度的聚类方法 其将点分为核心点与非核心点 后续采用类似区域增长方式进行处理 下图为DBSCAN聚类结果 可见其可以对任意类别的数据进行聚类 无需定义类别数量 DBSCAN聚类说明 DBSCA
  • 网络-----浅析IP数据报格式及TCP/UDP报文段首部格式

    IP数据报的格式 先来上张图在解释 来看看每个字段的具体含义 只讨论IPV4的情况 1 版本 占4位 指IP协议的版本 通信双方使用IP协议的版本必须一致 例 使用IPV4即填4 2 首部长度 占4位 顾名思义 这个字段就是标识了IP数据报
  • nginx 部署多个vue项目 多文件方式 conf.d/*.conf

    在nginx conf目录下新建conf d文件夹 nginx conf ngxin conf worker processes 1 events worker connections 1024 http include mime type
  • vue学习笔记(超详细)

    文章目录 一 Vue基础 认识Vue js Vue安装方式 Vue的MVVM 二 Vue基础语法 生命周期 模板语法 创建Vue options可以放什么 语法 综合 v on v for遍历数组 v model表单绑定 v model结合
  • 使用iperf测试设备的网络吞吐量

    iperf简介 iperf是一个基于Client Server的网络性能测试工具 可以测试TCP UDP和SCTP带宽质量 能够提供网络吞吐量信息 以及震动 丢包率 最大段和最大传输单元通统计信息 帮助我们测试网络性能 定位网络瓶颈 ipe
  • Python入门之print()函数

    Python利用print 函数将结果输出到标准输出设备 即显示器 上 print 函数主要有以下几个参数 1 print objects objects 0个或多个输出对象 print 拥有0个参数 输出换行 print 函数拥有一个参数
  • SynchronizedMap

    Doug Lea的 util concurrent包除了包含许多其他有用的并发构造块之外 还包含了一些主要集合类型 List和 Map的高性能的 线程安全的实现 Brian Goetz向您展示了用 ConcurrentHashMap替换 H
  • 西瓜书第一章笔记

    本章从如何挑选西瓜的经验出发 介绍了本书所涉及基本术语和概念 数据集 样本 特征 属性 特征空间 属性空间 样本空间 输入空间 特征向量 维数 学习 训练 训练数据 训练样本 假设 预测 标记 样例 标记空间 输出空间 测试 测试样本 分类
  • PAT B1014

    include
  • arcgis创建公里格网并计算格网内点的平均值最后形成马赛克式栅格图

    生成公里格网 在搜索框搜索create fishnet 点击create fishnet output feature class 输出格网的位置和名字 template extent 公里格网的范围 和什么层相同 cell size wi

随机推荐

  • 电脑壁纸链接

    电脑壁纸链接 一 壁纸网站 1 彼岸图网 2 H128壁纸 3 Wallhaven 4 Wallhere 二 游戏壁纸 英雄联盟 神泣 鬼泣 女神联盟2 崩坏3 三国杀 QQ飞车 QQ炫舞 阴阳师 幻塔 王者荣耀 逆战 上古王冠 永恒魔法
  • springboot jar 启动 指定端口和编码格式

    java Dfile encoding utf 8 jar xxxx jar server port 8715
  • linux网络服务[网络配置]——————配置网络IP临时[ifconfig、ip]、永久[nmtui、nmcli、网络链接配置文件]

    文章目录 1 临时设定 1 1 ifconfig命令 1 1 1 安装命令 1 1 2 查看网卡设备 1 1 3 设置IP 1 2 ip命令 1 2 1 安装命令 1 2 2 设定ip 2 永久设置ip的方法 2 1 nmtui 2 2 n
  • OSPF路由汇总和外部路由汇总

    OSPF路由汇总和外部路由汇总 AR1 ospf 1 router id 11 11 11 11 area 0 0 0 1 network 1 1 1 1 0 0 0 0 network 172 16 0 0 0 0 255 255 net
  • 可变参数函数

    c c 支持可变参数的函数 即函数的参数是不确定的 一 为什么要使用可变参数的函数 一般我们编程的时候 函数中形式参数的数目通常是确定的 在调用时要依次给出与形式参数对应的所有实际参数 但在某些情况下希望函数的参数个数可以根据需要确定 因此
  • 常见锁相关

    Linux 锁 futex 所有的futex同步操作都应该从用户空间开始 首先创建一个futex同步变量 也就是位于共享内存的一个整型计数器 当进程尝试持有锁或者要进入互斥区的时候 对futex执行 down 操作 即原子性的给futex同
  • 2023Android大厂面试题详解之内存优化,内存抖动和内存泄漏。(附面试题汇总)

    内存优化 内存抖动和内存泄漏 东方头条 详细讲解 性能优化 内存泄漏与内存抖动优化实战 详细讲解 享学课堂移动互联网系统课程 性能优化 内存泄漏与内存抖动优化实战 这道题想考察什么 内存抖动与内存泄漏是什么 会对程序造成什么影响 为什么会产
  • webpack 插件之Html-Webpack-Plugin

    webpack 插件之Html Webpack Plugin 1 为什么我们需要这个插件 先来看一个应用场景 我们自己打算搭建一个网站 这个网站有很多个页面 我们为每个页面创建一大堆的css样式 js脚本 然后尝试用webpack进行打包
  • 【微信小程序】小程序获取元素的宽度高度

    微信小程序不能进行DOM操作 所以获取元素的信息就不能按照常规手法来做了 首先需要借助微信给我们开发者提供的一个API来实现返回一个SelectorQuery 对象实例 接下来就好办多了 话不多说 上代码 API wx createSele
  • 关于@RabbitListener注解自动ack的一些猜测

    一 起因 从网上获取到的信息 RabbitListener采用的是自动ack 二 实际现象 然而实际测试中发现 在消费者接受到消息后 消息并有立即从队列中移除 而是会在任务执行完成后才会从队列中移除 三 疑问 按照官方解释 消费者一旦设置了
  • 【Effective C++详细总结】第四章 设计与声明

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 C C 知识点 专栏定位 整理一下 C 相关的知识点 供大家学习参考 如果有收获的话 欢迎点赞 收藏 您的支持就
  • 部署Redis服务

    Redis介绍 Remote Dictionary Server 远程字典服务器 是一款高性能的 Key Values 分布式内存数据库 支持数据持久化 定期把内存里数据存储到硬盘 支持多种数据类型 支持master slave模式数据备份
  • 神经机器翻译(seq2seq RNN)实现详解

    http c biancheng net view 1947 html seq2seq 是一类特殊的 RNN 在机器翻译 文本自动摘要和语音识别中有着成功的应用 本节中 我们将讨论如何实现神经机器翻译 得到类似于谷歌神经机器翻译系统得到的结
  • yarn install时报错 error An unexpected error occurred: “https://registry.yarnpkg.com/... ETIMEDOUT“.

    当yarn install时出现error An unexpected error occurred https registry yarnpkg com caniuse lite caniuse lite 1 0 30001427 tgz
  • 递归与分治

    递归的定义 程序调用自身的编程技巧称为递归 递归做为一种算法在程序设计语言中广泛应用 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归策略只需少量
  • chatgpt赋能python:Python除零错误:原因,解决办法和实践建议

    Python 除零错误 原因 解决办法和实践建议 介绍 Python 作为一门广泛使用的高级编程语言 它的强大之处就体现在它的简洁性 可读性和易用性上 但是在实践中 有时候我们会遇到一些让我们不得不头痛的问题 其中之一就是 Python 除
  • Eclipse如何设置快捷键

    在eclopse设置注释行和取消注释行 打开eclipse 依次打开 Window gt Preferences gt General gt Key
  • Vue<router-view></router-view>学习心得

    今天看到个Vue项目结构中使用到了
  • C#基础教程(十四) String、StringBuilder、”==,equal,ReferenceEquals“

    1 内存分区 1 栈区 由编译器自动分配释放 存放值类型的对象本身 引用类型的引用地址 指针 静态区对象的引用地址 指针 代码中必须就栈的大小有明确的定义 栈区内存无需我们管理 也不受GC管理 栈顶元素使用完毕弹出就会立即释放 由操作系统管
  • 【0基础】学习solidity开发智能合约-初识solidity

    本篇课程开始 我们来学习一下如何使用solidity开发智能合约 由于博主对于solidity的学习 也是自学的 所以一些不足或有纰漏之处还望指出 大家共同进步 本系列课程会分很多节课讲述 从入门到进阶 实战 在课程最后 我们会通过所学知识