在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.rhkb.cn/news/153454.html

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

相关文章

微信小程序案例:2-2本地生活

文章目录 一、实现步骤&#xff08;一&#xff09;创建项目&#xff08;二&#xff09;创建页面&#xff08;三&#xff09;准备图片素材&#xff08;四&#xff09;编写页面结构1、编写轮播区域页面结构2、编写九宫格区域页面结构 &#xff08;五&#xff09;编写页面样式1、编…

Redis-持久化机制

持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术&#xff0c;他是看时间间隔内key值的变化量&#xff0c;就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程&#xff08;bgsave&#xff09;&#xff0c;通过这个子进程&#xff0c;将数据快照进…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client&#xff0c;我们是server&#xff0c;提供注册登入&#xff0c;场景选择等。信道模拟器是server&#xff0c;我们是client&#xff0c;我们向信道模拟器发送数据&#xff0c;等待信道模拟器计算结果&#xff0c;返回给无人机。…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

Magica Cloth 使用方法笔记

Magica Cloth 使用方法笔记 官方使用文档链接&#xff1a; インストールガイド – Magica Soft 鱼儿效果案例&#xff1a; https://www.patreon.com/posts/69459293 安装环境&#xff1a; 关于在Unity 2018.4.12版本 下 导入 Magic Cloth 之前&#xff0c;需要提前置入的…

FreeRTOS学习笔记(一)

一、基础知识思维导图 vtaskdelay函数会开启中断&#xff0c;所以在临界区不能用vtaskdelay 二、任务的创建与删除 2.1、任务的动态创建与删除 ........#define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void …

springboot项目集成kafka,并创建kafka生成消息线程池

效果图: 步骤1:添加依赖 <!-- kafka依赖 --><dependency><groupId>org.apache.kafka</groupId><<

vue-slot插槽

作用&#xff1a;让父组件可以向子组件中任意位置插入html结构&#xff0c;也是组件通信方式的一种&#xff0c;适用于父组件》子组件 分类: 默认插槽、具名插槽、作用域插槽 定义子组件时使用slot组件&#xff0c;在使用子组件是可以决定是否插入具体的html代码 默认插槽 如…

【无公网IP内网穿透】基于NATAPP搭建Web站点

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《.内网穿透》。&#x1f3af;&#x1f3af; &#…

RustDay01——运行在线GitHub Rust环境

1.跟着教程进入GitHub教室 2. 授权确认后进入学习空间 3.点击链接进入在线平台 4.添加本机密钥对到GitHub 5. 安装依赖 我们使用在线的Linux试验平台&#xff0c;就自动帮我们clone好了仓库 我们直接在仓库目录执行 cargo install --force --path . 安装依赖 PS:其实刚开始…

数据结构 | (三) Stack

栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&#xff1a;栈…

在Kubernetes中实现gRPC流量负载均衡

在尝试将gRPC服务部署到Kubernetes集群中时&#xff0c;一些用户&#xff08;包括我&#xff09;面临的挑战之一是实现适当的负载均衡。在深入了解如何平衡gRPC的方式之前&#xff0c;我们首先需要回答一个问题&#xff0c;即为什么需要平衡流量&#xff0c;如果Kubernetes已经…

苹果遭遇安全危机,应用商店曝出不良APP,或影响iPhone的销售

据澎湃新闻报道指苹果的App Store被曝出不良APP位居下载榜前列&#xff0c;这对于向来强调APP严格审核的苹果来说是巨大的打击&#xff0c;更影响向来被认为信息安全遥遥领先的名声&#xff0c;对当下正热销的iPhone15或造成打击。 据了解被曝的软件以“学习XX字母”为命名&…

2020架构真题(四十六)

、以下关于操作系统微内核架构特征的说法&#xff0c;不正确的是&#xff08;&#xff09;。 微内核的系统结构清晰&#xff0c;利于协作开发微内核代码量少&#xff0c;系统具有良好的可移植性微内核有良好的的伸缩性和扩展性微内核功能代码可以互相调用&#xff0c;性能很高…

Unity官方文档中关于内存管理的翻译(2021.3)

原文:Memory in Unity - Unity 手册 Unity内存管理 为了确保您的应用程序运行时没有性能问题&#xff0c;了解Unity如何使用和分配内存非常重要。本文档的这一部分解释了Unity中内存是如何工作的&#xff0c;适用于希望了解如何提高应用程序内存性能的读者。 Unity使用三个内…

第二证券:汽车产业链股活跃,恒勃股份、博俊科技“20cm”涨停

轿车产业链股9日盘中走势活跃&#xff0c;截至发稿&#xff0c;恒勃股份、博俊科技“20cm”涨停&#xff0c;德迈仕涨超17%&#xff0c;上声电子涨超14%&#xff0c;川环科技涨超10%&#xff0c;圣龙股份、科华控股、沪光股份、上海沿浦、日盈电子、赛力斯等均涨停。 工作方面…

扬尘监测:智能化解决方案让生活更美好

随着工业化和城市化的快速发展&#xff0c;扬尘污染问题越来越受到人们的关注。扬尘不仅影响城市环境&#xff0c;还会对人们的健康造成威胁。为了解决这一问题&#xff0c;扬尘监测成为了一个重要的手段。本文将介绍扬尘监测的现状、重要性以及智能化解决方案&#xff0c;帮助…

基于goravel的CMS,企业官网通用golang后台管理系统

2023年9月11日10:47:00 仓库地址&#xff1a; https://gitee.com/open-php/zx-goravel-website 框架介绍 Goravel SCUI 后端开发组件 go 1.20 Goravel 1.13 数据库 sql(使用最新日期文件) goravel\doc\sql_bak mysql 8.0 前端开发组件 scui 1.6.9 node v14.21.3 效果图…

QT:SQLITE数据库编程

pro文件&#xff1a;QT core gui sql widget.ui main.cpp #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w("./student.db"); //传入文件名w.show();return a.exec…