web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲

news2025/7/24 11:10:26

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲

一、使用Remix演示智能合约部署

智能合约的代码编写一般都是在Remix上,Remix的好处的话就是可以在浏览器中快速开发和部署合约,无需在本地安装任何程序,十分适合新手。

对应的网址:https://remix.ethereum.org/

Remix 中,左侧菜单有三个按钮,分别对应文件(编写代码)、编译(运行代码)和部署(将合约部署到链上)。点击“创建新文件”(Create New File)按钮,即可创建一个空白的 Solidity 合约。
在这里插入图片描述

第一个Solidity程序“hello web3”
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract HelloWeb3{
    string public _string = "Hello Web3!";
}

我们详细的讲解一下上述代码的结构

1.第一行代码是注释部分,说明代码所使用的软件许可(license),这里使用的是MIT许可。如果不写许可就会出现警告(warning),然是程序还是可以正常运行的。注释以“//”开头

2.第二行声明源文件所使用的Solidity版本,不同的版本语法有差异。0.8.21的意思就是说源文件的版本不允许小于0.8.21或者大于等于0.9.0。以“”开头 — “;”结尾。

3.下面为代码部分。使用“contract”创建合约并声明合约的名称为“HelloWeb3”。第四行为合约内容,声明了一个名称为_string 的 string类型的变量,并赋值为“Hello Web3!”

编译部署代码

在Remix页面编译代码非常方便,写好代码后,ctrl+s保存即可编译代码。编译完成后找到左侧的部署界面点击“Deploy”部署即可。
在这里插入图片描述
如下图可以看到部署完成后现实的“hello web3!”
在这里插入图片描述

二、智能合约的案例学习-荷兰式拍卖

荷兰式拍卖在 – 加密猫 中非常流行

加密猫是以太坊上的第一个大型的NFT应用;是一个在以太坊上的猫咪收集游戏吸引了超过百万的资金。这也是只有区块链技术才能造就的游戏。
在这里插入图片描述

加密猫的购买方式基于“荷兰式”拍卖

“立刻购买” 价格在初始设定的时为最高价格。随着时间推移,“立刻购买”的价格随着曲线不断降低。

拍卖过程的任何时刻只要有人参与拍卖,满足对应的条件,获拍者就能够声明并购买到加密猫。
在这里插入图片描述
荷兰式拍卖代码

contract DutchAuction {
	//Parameters
	uint public initialPrice; uint public biddingPeriod; //初始的拍卖价格;设定拍卖时长
	uint public offerPriceDecrement; uint public startTime; //价格下降速率字段;开始拍卖时间戳
	//KittyToken外部合约,代表的是被出售的NFT加密猫的地址;seller出售方的地址
	KittyToken public kitty; address payable public seller;
	//winnerAddress获拍方的地址
	address payable winnerAddress;
	//立刻购买的函数
	function buyNow() public payable {
		//确定当前拍卖的价格,通过当前的区块时间-拍卖的开始时间
		uint timeElapsed = block.timestamp - startTime;
		//起始价格-时间*价格下跌的速率;得到当前价格
		uint currPrice = initialPrice - (timeElapsed * offerPriceDecrement);
		//用户出价(输入值)
		uint userBid = msg.value;
		//检查竞拍是否是有效的
		//竞拍者的地址
		require(winnerAddress == address(0)); //Auction hasnot ended early
		//竞拍是否在规定的时间内
		require(timeElapsed < biddingPeriod); //Auction hasnot ended by time
		//竞拍者是否有足够的资金
		require(userBid>=currPrice); //Bid is big enough
		
		winnerAddress = payable(msg.sender);
		winnerAddress = transfer(userBid - currPrice); //Refund the difference
		seller.transfer(currPrice);
		//调用加密猫外部合约,将加密猫的所有权转移给获拍者
		kitty.transferOwnership(winnerAddress);
	}
}

三、以太坊上的gas费

以太坊上的每一笔交易都需要支付交易费(gas)

交易越复杂支付的gas费就越高,gas费的支付在以太坊上都是使用原生代币来支付的,在以太坊上就是ETH
在这里插入图片描述

矿工在每个区块都会对Gas使用设定全局上限;意味着在每个区块中大约可以运行多少段智能合约的代码是有限制的。
在这里插入图片描述

每一笔操作都会需要支付特定数量的gas

在执行交易的时候会有一个计数器计算gas的消耗;在执行合约的时候必须要有足够的gas费用,如果gas费用不够的话就无法去执行相应的合约

contract MyRegistry {
	mapping(string => address) public registry;
	function registerDomain(string memory domain) public {
		// can only reserve new unregistered domain names
		//执行完代码后会看到有多少gas的剩余
		require(registry[domain] == address(0));
		//update the owner of this domain
		registry[domain] = msg.sender;
	}
}
gas上限和退款
  • 每一笔交易都会设定一个gas上限,以及购买gas的价格,以ETH计算
  • 预留对应数量的以太坊在交易执行之前支付
  • 在合约执行之后,没有使用的gas会被退还
    在这里插入图片描述
EVM中有索引表,每一个操作符都有对应的gas价格

以太坊虚拟机编码了操作符,不是高级语言

公式(FORMULA)意味着这个操作符对应的gas取决于参数
在这里插入图片描述

如果gas用完了会怎么样
  • 会出现一个Gas用完(out-of-gas)的异常
  • 任何对存储变量,转账等的改动都会回到调用这个方式之前
  • 仍然需要支付在出现异常之前每一笔操作所需要的Gas
  • 和其他异常一样,可以用其他处理函数捕获(类似于java的try catch)
  • 只需使用一部分可用的Gas就可以调用方法
    在这里插入图片描述

总结

本文介绍了使用Remix部署智能合约的方法以及以太坊gas费机制。首先通过"hello web3"案例演示了Remix编写、编译和部署智能合约的基本流程。其次以加密猫的荷兰式拍卖为例,解析了智能合约在实际应用中的实现逻辑。最后详细讲解了以太坊gas费机制,包括gas的计算方式、上限退款规则以及gas耗尽时的异常处理。文章涵盖智能合约开发的关键环节,为初学者提供了实用的技术指南。

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

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

相关文章

网络编程及原理(一)

目录 一 . 独立模式与网络互联 二 . 局域网 —— LAN &#xff08;1&#xff09;基于网线直连 &#xff08;2&#xff09;基于集线器组建 &#xff08;3&#xff09;基于交换机组建 &#xff08;4&#xff09;基于交换机和路由器组建 三 . 广域网 —— WAN 四 …

【Linux】进程 信号保存 信号处理 OS用户态/内核态

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、信号保存 ✨进程如何完成对信号的保存&#xff1f; ✨在内核中的表示 ✨sigset_t ✨信号操作函数 &#x1fa84;sigprocmask --- 获取或设置当前进程的 block表 &#x1fa84;s…

[ Qt ] | 与系统相关的操作(一):鼠标相关事件

目录 信号和事件的关系 (leaveEvent和enterEvent) 实现通过事件获取鼠标进入和鼠标离开 (mousePressEvent) 实现通过事件获得鼠标点击的位置 (mouseReleaseEvent) 前一个的基础上添加鼠标释放事件 (mouseDoubleClickEvent) 鼠标双击事件 鼠标移动事件 鼠标滚轮事件 …

stm32使用hal库模拟spi模式3

因为网上模拟spi模拟的都是模式0&#xff0c;很少有模式3的。 模式3的时序图&#xff0c;在clk的下降沿切换电平状态&#xff0c;在上升沿采样&#xff0c; SCK空闲为高电平 初始化cs&#xff0c;clk&#xff0c;miso&#xff0c;mosi四个io。miso配置为输入&#xff0c;cs、c…

OurBMC技术委员会2025年二季度例会顺利召开

5月28日&#xff0c;OurBMC社区技术委员会二季度例会顺利召开。本次会议采用线上线下结合的方式&#xff0c;各委员在会上听取了OurBMC社区二季度工作总结汇报&#xff0c;规划了2025年三季度的重点工作。 会上&#xff0c;技术委员会主席李煜汇报了社区2025年二季度主要工作及…

postman自动化测试

目录 一、相关知识 1.网络协议 2.接口测试 3.编写测试用例 4.系统架构 二、如何请求 1.get请求 ​编辑2.post请求 3.用环境变量请求 4.Postman测试沙箱 一、相关知识 1.网络协议 规定数据信息发送与解析的方式。 网络传输协议 https相比http&#xff0c;信息在网…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法&#xff1a;递归 计算二叉树的直径可以理解…

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)

**摘要&#xff1a;**数字人技术从静态建模迈向动态交互&#xff0c;AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈&#xff0c;但通过多模态融合技术、轻量化动捕方案等创新&#xff0c;数字人正逐步实现自然交互与情感表达。…

针对KG的神经符号集成综述 两篇

帖子最后有五篇综述的总结。 综述1 24年TKDD 系统性地概述了神经符号知识图谱推理领域的进展、技术和挑战。首先介绍了知识图谱&#xff08;KGs&#xff09;和符号逻辑的基本概念&#xff0c;知识图谱被视为表示、存储和有效管理知识的关键工具&#xff0c;它将现实世界的知识…

RabbitMQ和MQTT区别与应用

RabbitMQ与MQTT深度解析&#xff1a;协议、代理、差异与应用场景 I. 引言 消息队列与物联网通信的重要性 在现代分布式系统和物联网&#xff08;IoT&#xff09;生态中&#xff0c;高效、可靠的通信机制是构建稳健、可扩展应用的核心。消息队列&#xff08;Message Queues&am…

Axure设计案例:滑动拼图解锁

设计以直观易懂的操作方式为核心&#xff0c;只需通过简单的滑动动作&#xff0c;将拼图块精准移动至指定位置&#xff0c;即可完成解锁。这种操作模式既符合用户的日常操作习惯&#xff0c;在视觉呈现上&#xff0c;我们精心设计拼图图案&#xff0c;融入生动有趣的元素&#…

MySQL权限详解

在MySQL中&#xff0c;权限管理是保障数据安全和合理使用的重要手段。MySQL提供了丰富的权限控制机制&#xff0c;允许管理员对不同用户授予不同级别的操作权限。本文将会对MySQL中的权限管理&#xff0c;以及内核如何实现权限控制进行介绍。 一、权限级别 MySQL 的权限是分层…

解决fastadmin、uniapp打包上线H5项目路由冲突问题

FastAdmin 基于 ThinkPHP&#xff0c;默认采用 URL 路由模式&#xff08;如 /index.php/module/controller/action&#xff09;&#xff0c;且前端资源通常部署在公共目录&#xff08;如 public/&#xff09;下。Uniapp 的历史模式需要将所有前端路由请求重定向到 index.html&a…

web3-区块链的交互性以及编程的角度看待智能合约

web3-区块链的交互性以及编程的角度看待智能合约 跨链交互性 交互性 用户在某一区块链生态上拥有的资产和储备 ​ 目标&#xff1a;使用户能够把资产和储备移动到另一个区块链生态上 可组合性 使在某一区块链的DAPP能调用另一个区块链上的DAPP 如果全世界都在用以太坊就…

数据结构(7)—— 二叉树(1)

目录 前言 一、 树概念及结构 1.1树的概念 1.2树的相关概念 1.3数的表示 1.二叉树表示 2.孩子兄弟表示法 3.动态数组存储 1.4树的实际应用 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 1.满二叉树 2. 完全二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.顺序存储 2.链式存储…

如何使用 Docker 部署grafana和loki收集vllm日志?

环境: Ubuntu20.04 grafana loki 3.4.1 问题描述: 如何使用 Docker 部署grafana和loki收集vllm日志? 解决方案: 1.创建一个名为 loki 的目录。将 loki 设为当前工作目录: mkdir loki cd loki2.将以下命令复制并粘贴到您的命令行中,以将 loki-local-config.yaml …

Kafka入门- 基础命令操作指南

基础命令 主题 参数含义–bootstrap-server连接的Broker主机名称以及端口号–topic操作的topic–create创建主题–delete删除主题–alter修改主题–list查看所有主题–describe查看主题的详细描述–partitions设置分区数–replication-factor设置分区副本–config更新系统默认…

目标检测我来惹1 R-CNN

目标检测算法&#xff1a; 识别图像中有哪些物体和位置 目标检测算法原理&#xff1a; 记住算法的识别流程、解决问题用到的关键技术 目标检测算法分类&#xff1a; 两阶段&#xff1a;先区域推荐ROI&#xff0c;再目标分类 region proposalCNN提取分类的目标检测框架 RC…

lua的笔记记录

类似python的eval和exec 可以伪装成其他格式的文件&#xff0c;比如.dll 希望在异常发生时&#xff0c;能够让其沉默&#xff0c;即异常捕获。而在 Lua 中实现异常捕获的话&#xff0c;需要使用函数 pcall&#xff0c;假设要执行一段 Lua 代码并捕获里面出现的所有错误&#xf…

智能进化论:AI必须跨越的四大认知鸿沟

1. 智能缺口&#xff1a;AI进化中的四大认知鸿沟 1.1 理解物理世界&#xff1a;从像素到因果的跨越 想象一个AI看着一杯倒下的水&#xff0c;它能描述“水滴形状”却无法预测“桌面会湿”。这正是当前AI的典型困境——缺乏对物理世界的因果理解。主流模型依赖海量图像或视频数…