当前位置: 首页 > news >正文

在Remix中编写你的第一份智能合约

智能合约简单来讲就是:部署在去中心化区块链上的一个合约或者一组指令,当这个合约或者这组指令被部署以后,它就不能被改变了,并会自动执行,每个人都可以看到合约里面的条款更深层次的理解就是:这些代码会被去中心化地执行,就像一群人运行了某个软件,这意味着没有一个人或者一个主体可以修改这些合约或者更改条款。

1.智能合约行业应用

DeFi:代表去中心化金融,它让用户可以参与到金融市场,而不需要经过中心化中介。
比如Robinhood,你不需要再信任Robinhood会持续给你提供服务,让你接入市场,相反,你可以直接查看智能合约,对,这样就可以进入市场。或者在2008年金融危机,你再也不用相信,这些集团和机构会在后台给你提供正确的信息,你在区块链上就可以看到所有的东西,它们都是透明的。你可以简单,安全和高效的参与很多事情,像是货币市场和复杂的金融产品,截止到2022年为止,有大概2000亿美元的资产在DeFi中被管理,并且还在快速增长。
Dao:去中心化自治组织,是另一个应用。Dao是完全被去中心化管理的组织,它们被区块链上的一组指令或者一个智能合约管理,这样的管理方式很有优势,参与更加简单,规则黑白分明,并且你可以直接在链上看到所有的事情。投票和治理,使用的是完全去中心化的技术,区块链是能够让我们推动治理技术进步的重要技术之一。它让治理更加的高效,公平和合理。
NFT:即非同质化代币,它在某种程度是一种电子艺术品,或者是一个独一无二的资产。像是无聊猿和加密朋克这样的项目,革新了人们获得报酬的方式,人们可以通过工作,展示创造性和状态而获得报酬

2.Remix介绍

Remix是一个强大的工具,因为它有很多功能,帮助我们查看和交互智能合约,虽然我们会渐渐脱离Remix,使用本地开发环境,但是Remix对学习智能合约基础非常有帮助,Remix官网。
当你进入Remix页面,你会发现有很多东西,还有很多Plugin,因为我们要使用Solidity,也就是智能合约的语言。
在这里插入图片描述

3.Solidity数据类型

Solidity有多种基础数据类型,最基础的四种数据类型是,boolean,uint,int和address。 还有数组(array)、结构体(struct)和映射(mapping)或者还有bytes,它们是一种更底层的数据类型。
boolean定义true和false;
uint是无符号整数,表示这个数字不是可正可负,只能是正数;uint比较特殊,我们可以决定给它分配的空间,这个数字一直可以大到uint256,uint默认就是uint256。通常,把分配空间显式的写出来是一个好习惯。
int可以表示正数或负数;同样的,我们也可以决定分配给int变量的空间。
address表示地址,就像在MetaMask中看到的地址一样。
具体在Remix定义的变量类型代码如下所示:

// SPDX-License-Identifier: MIT
// 定义solidity的版本 此处允许0.8.8以上的版本,但不允许0.9.0以上的版本
pragma solidity ^0.8.8 <0.9.0;contract SimpleStorage{bool hasFavoriteNumber = false;//uint允许分配的空间只能以byte的速度增长 uint8 uint16...uint256 最大只能到uint256uint256 favoriteNumber = 123;int64 favoriteInt = -5;string favoriteNumberInText = "five";//string类型变量只允许存储文本address myAddress = 0x993CC624c1350D52cCbe32F77652362F82fc4D41;
}

4.Solidity函数

函数或者方法指的是独立模块,在我们调用的时候会执行某些指令。Solidity中定义函数与JavaScript中类似,使用function关键字即可。
函数变量有四种可见度标识符:
public:在外部和内部都可见,任何与合约交互的人,都可以看到被public修饰的变量和函数,给变量或函数加上public修饰符,实际上给给其创建了getter函数,创建一个返回其值的函数。
private:private表示只有这个合约可以调用这个函数,private表示只对合约内部可见;
external:external表示只对合约外部可见
internal:internal表示只有这个合约或者继承它的合约可以读取
一般变量或函数的修饰符的默认值是internal,表示只对本合约和继承合约可见
另外,solidity中还有两个关键字可以用来修饰函数,标识函数的调用不需要消耗gas,分别是view和pure,如果一个函数被view修饰,意味着我们只会读取这个合约的状态。被view修饰的函数不允许修改任何状态,你在其函数中不能修改任何状态,同理,pure函数也不允许修改状态,同时pure函数也不允许读取区块链数据。pure函数通常用于执行数学运算或其他不涉及状态更改的计算。
具体关于函数实现的solidity代码如下所示:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8 <0.9.0;contract SimpleStorage{//uint允许分配的空间只能以byte的速度增长 uint8 uint16...uint256 最大只能到uint256uint256 public favoriteNumber = 123;//设置公开可见function store(uint256 _favoriteNumber) public {favoriteNumber = _favoriteNumber;}function getFavoriteNumber() public view returns(uint256){return favoriteNumber;}function testPure() pure public returns(uint){return (1+1);}
}

5.Mapping映射

使用mapping映射比数组遍历查找元素更加高效,可以达到O(1)级别,而数组遍历是O(n)级别;
你可以简单把映射想象成字典,它是一组键值对,每个key键返回与该键关联的某个value值,我们创建一个映射变量的方式与创建其他所有变量的方式完全相同;具体如下所示:

mapping(string => uint256) public nameToFavoriteNumber

具体有关映射的定义以及添加元素的操作如下所示:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8 <0.9.0;contract SimpleStorage{//uint允许分配的空间只能以byte的速度增长 uint8 uint16...uint256 最大只能到uint256uint256 public favoriteNumber = 123;//设置公开可见struct People{string name;uint256 favoriteNumber;}//定义结构体//定义映射mapping(string => uint256) public nameToFavoriteNumber;People[] public people;//定义结构体数组(存储多个结构体的数组)function store(uint256 _favoriteNumber) public {favoriteNumber = _favoriteNumber;}//这里被view修饰的函数调用不消耗gas 表示只读函数 不修改或改变区块链已有的状态function getFavoriteNumber() public view returns(uint256){return favoriteNumber;}//定义添加数组元素的函数function addPerson(string memory _name,uint _favoriteNumber) public{//这里由于string底层数bytes数组,因为需要使用memory关键字people.push(People(_name,_favoriteNumber));nameToFavoriteNumber[_name] = _favoriteNumber;}
}

这里需要注意,代码里面有关于数组和结构体的定义与实现,由于其与Java和C++定义方式类似,这里读者可以类比理解,所以并没有做详细阐述。

6.EVM介绍

前面我们通过solidity编写的所有合约代码,它都是在EVM(Ethereum Virtual Machine)上编译的。
EVM(Ethereum Virtual Machine)就是往以太坊区块链上部署智能合约的一个标准,并且任何实现某种EVM的区块链,你都可以把solidity代码部署上,例如Avalanche,Fantom,Polygon,它们都是与EVM兼容的,意思就是我们可以把编写的solidity代码部署到这些区块链上。
回顾整个智能合约:
在智能合约中你要做的第一件事就是告诉solidity,你正在使用哪个版本的solidity,并且你得在首行添加// SPDX-License-Identifier: MIT,从而消除警告信息,接着你就要使用关键字contract创建你的合约对象并为它命名,solidity中的合约(contract)就类似与其他面向对象语言中的class类,并且花括号{}内的所有内容都是该合约的组成部分。
solidity中有许多不同的数据类型,例如无符号整形uint,布尔值(boolean)、字符串(string)、字节(bytes32) 等等。如果你想创建一种新类型,可以创建一个所谓的结构体(struct),也可以创建数组(array)或者说列表(list),也可以创建字典(dictionary)或者说映射(mapping),当你给它一个键(key)时,它就会返回该键对应的值(value)。我们还可以在solidity中创建函数,以修改区块链的状态,函数使用view和pure修饰便表示是不修改区块链状态的函数,我们也可以在函数中指定不同的数据位置,calldata和memory的意思就是该数据只是临时数据,它们只在函数运行期间存在,storage变量则是永久存在的,而函数参数由于是临时变量因此不能使用storage变量,当我们编写好solidity代码并在Remix点编译(compile),它就会将代码按照以太坊虚拟机的格式进行编译。
编写好智能合约代码后,在Remix可以直接使用快捷键Ctrl+S编译,编译成功后会在侧边栏出现一个绿色的小图标,然后点击侧边第四个图标进入部署界面,首先选择虚拟账户,因为我们是部署到Remix自带的虚拟机中,然后设置gas limit限制,然后点击部署按钮即可,部署成功后便可以看到自动生成了一个合约账户,到此,你便完成了你的第一份智能合约。

在这里插入图片描述

相关文章:

在Remix中编写你的第一份智能合约

智能合约简单来讲就是&#xff1a;部署在去中心化区块链上的一个合约或者一组指令&#xff0c;当这个合约或者这组指令被部署以后&#xff0c;它就不能被改变了&#xff0c;并会自动执行&#xff0c;每个人都可以看到合约里面的条款。更深层次的理解就是&#xff1a;这些代码会…...

如何查看dll文件内导出函数名称

一 使用VS自带工具 进入VS开发环境&#xff0c;然后Tools -> Visual studio 2017 Command Prompt&#xff0c;打开兼容工具命令提示符&#xff0c; 如果工具 目录下没有命令行提示&#xff0c;可以从开始菜单找到VS的命令行提示符。 cd到dll所在目录&#xff0c;输入命令…...

学习笔记|串口通信的基础知识|同步/异步|RS232|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择&#xff1a;实现分时复用模式选择串口1模式1&#xff0c;模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序…...

JAVA String 和 String[][]互转的两种方法

第一种方法&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.40</version> </dependency>字符串转数组&#xff1a; String s "[[22,23,23],[1,10,20]]"…...

推荐几个制作svg的工具

以下是一些用于制作SVG&#xff08;可缩放矢量图形&#xff09;的工具和软件&#xff0c;适用于不同技能级别和需求&#xff1a; Adobe Illustrator&#xff1a;作为业界标准之一&#xff0c;Adobe Illustrator是功能强大的矢量图形编辑软件&#xff0c;适用于专业设计师和创意…...

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证...

Springboot实现Web组件注册

一、前言 在实际开发中&#xff0c;有时候我们可能使用springboot注册web组件&#xff0c;实现某些功能&#xff0c;比如我们需要生成一些api来提供对外的服务&#xff0c;而对应的路径其实是不固定的&#xff0c;那么这种情况下&#xff0c;其实是可以通过这种方式来注册web组…...

Element组件案例 Vue路由 前端打包部署步骤

目录 Element组件案例案例需求与分析环境搭建整体布局顶部标题左侧导航栏核心-右侧导航栏表格编写表单编写分页工具栏编写 异步数据加载异步加载数据性别展示修复图片展示修复 Vue路由Vue路由简介Vue路由入门 打包部署前端工程打包部署前端工程nginx介绍部署 Element组件案例 …...

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新&#xff1b;老项目要准备升级&#xff0c;新项目的mysql必须是mysql8.0&#xff08;2023-10&#xff09; 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…...

解密.kat6.l6st6r勒索病毒:保护数据的关键方法

导言&#xff1a; 网络威胁如雨后春笋&#xff0c;而 .kat6.l6st6r 勒索病毒则是其中一个异常狡猾的恶棍。本文91数据恢复将深入探讨 .kat6.l6st6r 勒索病毒的特点、数据恢复方法以及如何有效地预防这一数字威胁。 数据的重要性不容小觑&#xff0c;您可添加我们的技术服务号&a…...

Godot 添加信号

前言 Godot 里面C#和GDScirpt 的用法完全不一样&#xff0c;网上相关资料太少了。 什么是信号 信号分为信号源&#xff0c;触发&#xff0c;目的节点。信号源在某些条件下触发信号&#xff0c;比如按钮点击&#xff0c;鼠标悬停等事件 #mermaid-svg-wyr9ARVcBFmUUu8y {font-…...

JS如何判断文字是否溢出(被ellipsis)?

如果想要文本超出宽度后用省略号省略&#xff0c;只需要加上以下的css就行了。 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }3行css搞定&#xff0c;但是问题来了&#xff1a;如果我们想要当文本被省略的时候&#xff0c;也就是当文本超出指定…...

pb:常用函数和语句清单

pb:常用函数和语句清单 PB中提供了600多个函数,这还没有将B/S开发、数据窗口对象中的函数计算在内。但是,只要掌握、熟练运用、真正理解下面的这些函数(包括部分语句)就可以开发软件项目了。这些函数和语句是我给学员讲课时开发的一个完整的管理系统(提供了MIS必须的完整模…...

(8)SpringMVC中的视图类型及其特点,以及视图控制器view-controller的配置

SpringMVC的视图 转发和重定向的区别及其原理,参考文章 视图类型及特点 视图的作用就是将Model中的数据渲染到页面上并展示给用户,SpringMVC中视图对应的View接口有三种实现类对应三种视图解析器 默认有转发视图InternalResourceView和重定向视图RedirectView以及Thymeleaf…...

ansible学习笔记分享

yum install ansible -y #安装&#xff0c;注意yum源问题 yum源&#xff1a; yum install epel-release -y mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak >> /dev/null yum clean all rpm -Uvh http://mirrors.ustc.edu.cn/epel/epel-releas…...

以dzzoffice为例设置通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)

在测试dzzoffice的过程中&#xff0c;需要配置邮件服务器&#xff0c;dzzoffice的邮件设置有三种选项&#xff1a; 1、通过 PHP 函数的 sendmail 发送(推荐此方式) 2、通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证) 3、通过 PHP 函数 SMTP 发送 Email(仅 Windows 主机下有…...

加拿大艾伯塔省执法部门利用OpenText Encase显着提高案件效率

艾伯塔省执法部门利用OpenText Encase显着提高案件效率 Internet Child Exploitation Unit (ICE) 使用OpenText EnCase Forensic 加快结案进度并起诉更多罪犯 挑战 从证据收集到报告和起诉的过程非常耗时; 需要工具帮助快速可靠地收集、分析和存储数字证据。 结果 显著提高案…...

【Codeforces】Educational Codeforces Round 156 [Rated for Div. 2]

hh第一次记录cf。 复盘 ab题目比较清晰&#xff0c;只开了这两题&#xff0c;后面看了下cd&#xff0c;即使开了翻译也看不懂题目是什么意思&#xff0c;最后放弃睡觉了。。 a是一道思维题&#xff0c;翻了下别人写的发现大家写的各不相同hh b是一道数学题&#xff0c;过程有点…...

结合swagger的前端架构小记

1.引言 开发中&#xff0c;我们是否经常遇到以下痛点&#xff1a; 项目越大&#xff0c;启动和热更新越来越慢&#xff0c;启动都要花个3-5分钟以上没有类型&#xff0c;接口返回的Object不拿到真实数据都不知道有哪些字段需要手动写很多request函数去调用api&#xff0c;手动…...

Python字典全解析:从基础到高级应用

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python 字典是一种强大而多才多艺的数据类型&#xff0c;它以键-值对的形式储存信息&#xff0c;让我们能够以惊人的效率处理和管理数据。 字典能够将键和值关联在一起&#xff0c;使得数据的存储和检索变得非常高效。…...

Fourier变换中的能量积分及其详细证明过程

Fourier变换中的能量积分及其详细证明过程 在使用Fourier变换分析信号时候&#xff0c;有时需要用到能量积分。本文对Fourier变换的能量积分进行分析。 一、Fourier变换中的能量积分 若 F ( ω ) F [ f ( t ) ] F(\omega)\mathscr F[f(t)] F(ω)F[f(t)]&#xff0c;则有 ∫…...

保护 Web 服务器安全性

面向公众的系统&#xff08;如 Web 服务器&#xff09;经常成为攻击者的目标&#xff0c;如果这些业务关键资源没有得到适当的保护&#xff0c;可能会导致安全攻击&#xff0c;从而导致巨大的财务后果&#xff0c;并在客户中失去良好的声誉。 什么是网络服务器审核 当有人想要…...

docker数据管理和网络通信

docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…...

代理IP与Socks5代理:网络工程师的神奇魔法棒

网络工程师是数字世界的魔法师&#xff0c;而代理IP和Socks5代理则是他们的神奇魔法棒。这两项技术在跨界电商、爬虫、出海业务、网络安全和游戏等领域中&#xff0c;为网络工程师提供了强大的工具&#xff0c;让他们能够创造技术的奇迹。本文将深入研究这些神奇魔法棒在不同领…...

【K8S系列】深入解析k8s 网络插件—kube-router

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…...

Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

文章目录 Flutter跨平台概念介绍跨平台开发平台相关性Platform ChannelPlatform-specific UIPlatform Widgets 如何判断当前是什么平台实例 Platform 类介绍获取当前平台的名称检查当前平台其他属性 利用flutter设计跨Android和IOS平台应用的技巧1. 遵循平台的设计准则2. 使用平…...

gitlab docker部署,备份,恢复

本次安装在CentOS7下进行 1、安装yum 检查是否已经安装yum yum --version如果未安装 sudo yum install -y yum-utils添加镜像源&#xff1a; 国外镜像源&#xff1a;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里镜像源&am…...

腾讯云/阿里云国际站代理:阿里云、华为云和腾讯云“大展拳脚”,与国际巨头未来竞争焦点是AI计算?

国内云计算市场重新掀起的价格战&#xff0c;腾讯云国际站代理让竞争本就内卷的市场陷入白热化&#xff0c;中国云厂商深耕东南亚的意愿变强。2020年之后&#xff0c;上下游企业与中国云厂商抱团出海趋势明显。东软集团、用友网络等A股上市公司也在走向东南亚。 东南亚市场蛋糕…...

基于Java+SpringBoot+Vue企业OA管理系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

Java架构师系统架构设计性能评估

目录 1 导论2 架构评估基础系统性能衡量的基本指标2.1 系统性能的指标2.2 数据库指标2.3 并发用户数2.4 网络延迟2.4 系统吞吐量2.5 资源性能指标3 架构评估基础服务端性能测试3.1基准测试3.2 负载测试3.3 压力测试3.4 疲劳强度测试3.5 容量测试1 导论 本章的主要内容是掌握架构…...