在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限制,然后点击部署按钮即可,部署成功后便可以看到自动生成了一个合约账户,到此,你便完成了你的第一份智能合约。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊电子产品日本站PSE认证,TELEC认证如何办理?

日本市场准入认证——PSE认证&#xff0c;TELEC认证 日本作为第三大经济体国家&#xff0c;是中国商品对外出口的最多的国家之一&#xff0c;无论是在日本亚马逊销售还是在日本当地销售&#xff0c;都需要符合日本市场准入许可。需要注意的是日本的电气安全标准都是自主特色的…

R语言 一种功能强大的数据分析、统计建模 可视化 免费、开源且跨平台 的编程语言

R语言是一种广泛应用于数据分析、统计建模和可视化的编程语言。它由新西兰奥克兰大学的罗斯伊哈卡和罗伯特杰特曼开发&#xff0c;并于1993年首次发布。R语言是一个免费、开源且跨平台的语言&#xff0c;它在统计学和数据科学领域得到了广泛的应用。 R语言具有丰富的数据处理、…

基于docker+Keepalived+Haproxy高可用前后的分离技术

基于dockerKeepalivedHaproxy高可用前后端分离技术 架构图 服务名docker-ip地址docker-keepalived-vip-iphaproxy-01docker-ip自动分配 未指定ip192.168.31.252haproxy-02docker-ip自动分配 未指定ip192.168.31.253 安装haproxy 宿主机ip 192.168.31.254 宿主机keepalived虚…

《DevOps 精要:业务视角》- 读书笔记(三)

DevOps 精要:业务视角&#xff08;三&#xff09; 第3章 原则3.1 价值流3.2 部署流水线3.3 一切都应存储在版本控制系统中3.4 自动化配置管理3.5 完成的定义3.6 小结 第3章 原则 将原则从实践中分离出来&#xff0c;这是一种很有用的做法。当然了&#xff0c;这两个词分别有着…

前后端分离计算机毕设项目之基于SpringBoot的无人智慧超市管理系统的设计与实现《内含源码+文档+部署教程》

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Flutter环境搭建及新建项目

一、下载安装压缩包 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.10.6-stable.zip 二、解压缩 解压之后&#xff0c;将里面的flutter整体拿出来 三、配置环境变量 将flutter/bin全路径配置到系统环境变量里面 四、运行…

LLMs 蒸馏, 量化精度, 剪枝 模型优化以用于部署 Model optimizations for deployment

现在&#xff0c;您已经了解了如何调整和对齐大型语言模型以适应您的任务&#xff0c;让我们讨论一下将模型集成到应用程序中需要考虑的事项。 在这个阶段有许多重要的问题需要问。第一组问题与您的LLM在部署中的功能有关。您需要模型生成完成的速度有多快&#xff1f;您有多…

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…

Games104现代游戏引擎笔记高级ai

Hierarchical Task Network 层次任务网络 World State是一个主观的对世界的认知&#xff0c;并不是一个真实世界的描述 Sensors负责从游戏环境中抓取各种状态 HTN Domain 存放层次化的树状结构Task和之间的关联关系1 Planner 根据World State从 Domain 里规划 task Plan Runne…

Mac上安装Java的JDK多版本管理软件jEnv

JDK的多版本管理软件主要有以下三种&#xff1a; jEnv jEnv 是一个命令行工具&#xff0c;可以帮助您管理和切换不同版本的 Java 环境。它可以让您在不同的项目之间轻松切换 Java 版本。您可以使用 jenv global 命令设置全局 Java 版本&#xff0c;也可以使用 jenv local 命令…

短视频平台的那些事

短视频平台的那些事 文章目录 短视频平台的那些事1. 前言2. 概览介绍3. 业务框架4. 关键技术能力4.1 视频处理4.1.1 FFMPEG技术 4.2 视频安全&#xff0c;合规4.2.1 视频安全审核4.2.2 视频MD5校验4.2.3 视频AI指纹 4.3 视频内容理解4.3.1 视频分类4.3.2 视频标签4.3.3 视频质量…

windows docker desktop配置加速地址

目录 为什么常见加速地址在docker desktop上配置 为什么 https://hub.docker.com 是官方的镜像仓库地址&#xff0c;但是它的服务器地址是在国外&#xff0c;有时候访问和下载的速度差强人意。不过好在&#xff0c;我们可以进行远程仓库的设置&#xff0c;将仓库镜像地址设置为…

ChatGPT 背后包含了哪些技术?

ChatGPT 是由OpenAI开发的一款基于GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;的人工智能语言模型。这个模型是使用多种编程语言和技术组合编写的。 首先&#xff0c;ChatGPT 使用了 Python 作为主要的编程语言。Python 是一种流行的高级编程语言&…

Prometheus集成consul[被监控对象开启basic认证]

1&#xff0c;被监控对象开启basic认证 具体操作这里不再详细细讲。 2&#xff0c;将被监控对象注册到consul 由于被监控对象开启了basic认证&#xff0c;注册到consul后显示&#xff1a;401 Unauthorized Output: Unauthorized&#xff0c;不能够正常健康检查。 3&#xff0c…

AI绘画-Stable Diffusion笔记

软件&#xff1a;Stable Diffusion 视频教程来自 https://www.bilibili.com/video/BV1As4y127HW/?spm_id_from333.337.search-card.all.click 提示词 提示词类别 内容型提示词 人物主题特征&#xff1a; 服饰穿搭&#xff1a;white dress 发型发色&#xff1a;blonde hair,l…

TensorFlow案例学习:对服装图像进行分类

前言 官方为我们提供了一个 对服装图像进行分类 的案例&#xff0c;方便我们快速学习 学习 预处理数据 案例中有下面这段代码 # 预处理数据&#xff0c;检查训练集中的第一个图像可以看到像素值处于0~255之间 plt.figure() # 创建图像窗口 plt.imshow(train_images[0]) # …

开发过程教学——交友小程序

交友小程序 1. 我的基本信息2. 我的人脉2.1 我的关注2.2 我的粉丝 3. 我的视频4. 我的相册 特别注意&#xff1a;由于小程序分包限制2M以内&#xff0c;所以要注意图片和视频的处理。 1. 我的基本信息 数据库表&#xff1a; 我的基本信息我的登录退出记录我的登录状态&#x…

Godot 官方2D游戏笔记(1):导入动画资源和添加节点

文章目录 前言2D官方游戏案例资源下载项目配置添加角色节点模拟运行移动根节点 结束 Godot专栏地址 前言 Godot 官方给了我们2D游戏和3D游戏的案例&#xff0c;不过如果是独立开发者只用考虑2D游戏就可以了&#xff0c;因为2D游戏纯粹&#xff0c;我们只需要关注游戏的玩法即可…

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …

SpringCloud学习笔记-注册微服务到Eureka注册中心

目录 1.在该Module的pom文件中引入eureka依赖2.在该module的src/main/resources/application.yml配置文件3.启动对应的微服务4.查看微服务是否启动成功 假如我有一个微服务名字叫user-service,我需要把它注册到Eureka注册中心,则具体步骤如下: 1.在该Module的pom文件中引入eure…