web3系列———4.编写第一个智能合约并发布到链上

如何使用remix编写solidity智能合约并部署上链 快速上手remix,部署合约到测试链。 阅读详情

本篇教程为在以太坊区块链上发布一个智能彩票合约,活动期间用户可充值一定金额的以太币到合约地址,活动结束进行开奖,随机从参与用户中抽取3人,平分奖池奖金。(分为上下两篇)(本篇为下)

教程思路:

  1. 新建以太坊钱包
  2. 充值一定数额ETH作为合约发布汽油费
  3. Remix编写solidity智能合约
  4. 发布到链上

再次明确合约发布的流程:

用solidity或Vyper编写好智能合约代码=>编译为EVM可执行的字节码=>打包整个交易广播给以太坊的某些节点=>等待其被放入某个区块=>完成


编写Solidity智能合约:

Remix是什么:

Remix是一个专门编写智能合约的 WebIDE(web集成环境),支持Solidity和Vyper,可从浏览器直接访问,并且连接到 MetaMask从而发布交易。
所以我们只需要编写智能合约的代码,Remix会自动帮我们编译为EVM字节码,发布到区块链中。
跳转Remix
在自动帮我们创建好的contracts目录下新建Lottery.sol:

代码思路:

构造函数:

  1. 设置合约拥有者为部署合约的用户。
  2. 传入彩票的活动的持续时间,
  3. 将彩票活动标记为False(未结束)

用户参与函数:

  1. 允许任何用户调用
  2. 要求至少0.1个ETH才能参与活动
  3. 检查活动是否结束
  4. 活动未结束=>将参与用户的地址添加到参与者组中
  5. 触发彩票参与事件=>记录日志

彩票结束函数:

  1. 合约拥有者可调用
  2. 检查是否已到结束时间
  3. 检查彩票活动是否已标记为False(未结束)
  4. 检查是否有足够的参与者
  5. 将彩票活动标记为True(已结束)
  6. 开奖,从参与者数组中挑选三人
  7. 奖金转账给中奖者
  8. 触发彩票结束事件=>记录日志
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 定义一个彩票合约
contract Lottery {
    address public owner; // 合约的拥有者
    address payable[] public participants; // 参与彩票的用户数组
    uint256 public lotteryEndTime; // 彩票活动的结束时间
    bool public lotteryEnded; // 彩票活动是否已结束的标志

    // 定义一个事件,当用户参与彩票时触发
    event LotteryEnter(address indexed participant);
    // 定义一个事件,当彩票结束时触发,记录中奖者地址
    event LotteryEnd(address winner1, address winner2, address winner3);

    // 构造函数,设置彩票活动的持续时间
    constructor(uint _durationMinutes) {
        owner = msg.sender; // 设置合约拥有者为部署合约的用户
        lotteryEndTime = block.timestamp + (_durationMinutes * 1 minutes); // 计算彩票活动的结束时间
        lotteryEnded = false; // 初始化彩票活动未结束的标志
    }

    // 允许用户参与彩票的函数
    function enterLottery() public payable {
        require(msg.value == 0.1 ether, "Must send exactly 0.1 ETH"); // 要求用户支付0.1以太币
        require(block.timestamp <= lotteryEndTime, "Lottery has ended"); // 检查彩票活动是否已结束
        require(!lotteryEnded, "Lottery already ended"); // 检查彩票活动是否已标记为结束
        participants.push(payable(msg.sender)); // 将用户添加到参与者数组
        emit LotteryEnter(msg.sender); // 触发参与彩票的事件
    }

    // 结束彩票活动的函数,只能由合约拥有者调用
    function endLottery() public {
        require(msg.sender == owner, "Only owner can end the lottery"); // 只有合约拥有者可以结束彩票活动
        require(block.timestamp >= lotteryEndTime, "Lottery not yet ended"); // 检查彩票活动是否已到结束时间
        require(!lotteryEnded, "Lottery already ended"); // 检查彩票活动是否已标记为结束
        require(participants.length >= 3, "Not enough participants"); // 检查是否有足够的参与者

        lotteryEnded = true; // 标记彩票活动为已结束
        uint256 prize = address(this).balance / 3; // 计算每个中奖者的奖金
        // 为了避免重复中奖,我们需要一个方法来确保每个中奖者是唯一的
        // 以下是一个简单的解决方案,但请注意,这并不是一个安全的随机数生成方法
        // 在生产环境中,应该使用更安全的随机数生成方法,如Chainlink VRF
        address[3] memory winnersAddresses; // 创建一个固定大小为3的地址数组来存储中奖者地址
        uint256[] memory winners = new uint256[](3); // 创建一个大小为3的数组来存储中奖者的索引
        for (uint i = 0; i < 3; i++) {
            uint256 winnerIndex;
            bool isUnique;
            do {
                winnerIndex = random() % participants.length; // 随机选择一个参与者作为中奖者
                isUnique = true; // 假设选中的参与者是唯一的
                for (uint j = 0; j < i; j++) {
                    if (winners[j] == winnerIndex) {
                        isUnique = false; // 如果已经选中过,标记为不唯一
                        break;
                    }
                }
            } while (!isUnique); // 如果不唯一,重新选择
            winners[i] = winnerIndex; // 记录中奖者的索引
            winnersAddresses[i] = participants[winnerIndex]; // 记录中奖者的地址
            participants[winnerIndex].transfer(prize); // 将奖金转账给中奖者
        }
        // 循环结束,触发彩票结束的事件
        emit LotteryEnd(winnersAddresses[0], winnersAddresses[1], winnersAddresses[2]);

    }
    
    // 生成随机数的私有函数,用于选择中奖者
    function random() private view returns (uint) {
        // 使用区块难度、时间戳和参与者数组作为种子生成随机数
        return uint(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, participants)));
    }
}

在Solidity中,事件(Event)是智能合约的一种机制,用于在区块链上记录日志信息。当特定的函数被执行时,可以触发这些事件,并将信息记录到区块链上。这些记录是不可变的,且可以被区块链上的任何人查询,但不会影响区块链的状态。
上述代码中随机数生成方法不够安全,在实际应用中,应该使用专门的随机数服务,如Chainlink VRF,以确保公平性和安全性。


合约如何发布:

编译:

点击代码左上绿色三角,编译通过:

连接到MetaMask:

默认发布环境为Remix为我们提供的虚拟机,可在虚拟环境测试无误后再正式发布。
我们点击切换到Inject Provider-MetaMask环境,钱包自动弹出:

连接成功后,左侧可以看到我们的账户地址、余额,汽油费上限。在Deploy右侧可以看到我们在构造函数中设置的活动持续时间,设置为60min,点击Deploy发布。


部署成功后,可以在已部署合同中看到一条记录,点开可以看到我们的智能合约,函数显示在左侧供调用。

也可以打开Etherscan进行更详细的查看:

扫盲系列--Web3智能合约+Solidity简介 这几天web3智能合约这个概念,频繁映入我的眼帘。web3.0这个概念我听说过,核心特征是去中心化、开放性、隐私保护和数据所有权回归个人。Web 1.0是信息浏览时代,Web 2.0是用户参与和社交网络时代,Web 3.0是去中心化与智能化时代。在Web3.0这一新的互联网架构下,用户不再仅仅是内容的消费者,更是自己数字身份和数据的拥有者。Web 3.0旨在构建一个更加透明、安全且高效的信息网络。我对Web3.0的了解是一些比较宽泛的东西,这次想比较详细的了解一下web3中的智能合约。智能合约。 阅读详情

相关推荐

使用web3调用智能合约的简单例子

当使用Solidity语言开发完成一个智能合约并部署后,如何在一个Web应用程序(或者手机App)中调用它?使用web3.js库,可以很容易的做到这些。通过一个最简单的例子我们来看看如何做到这些,分为三个步骤。 1. 编写智能合约 简单起见,我们直接使用Remix自带的Storage.so合约l例子,就是简单的存储和获取一个整数数值。 pragma solidity >=0.4.22 <0.7.0; /** * @title Storage * @dev Store & retre

wumingzhifu的博客 9693

区块链web3智能合约开发学习-开发工具Remix(1)

将代码写到Remix IDE中进行编译部署和测试

泠泠似水 2378

11. 建立你的第一个Web3项目

通过本章节的实践,你已经了解了如何搭建Web3开发环境,编写和部署智能合约,以及开发一个与智能合约交互的dApp。这是Web3开发的基础技能,未来你可以在此基础上开发更复杂的去中心化应用。

sise_2022的博客 3725

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

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

m0_46421522的博客 1401

web3-python:使用python调用智能合约交互

安装 python、pycharm这些环境和开发工具大家自行安装即可,网上一搜都是教程,比我写的好很多,这部分内容不再赘述。 web3py文档:https://web3py.readthedocs.io/en/stable/index.html web3py应该是python上跟智能合约交互最好用的包了,首先我们安装一下。 直接使用:pip install web3 进行安装。 教程 查询余额 我们新建一个py文件,开始编码吧~ from web3 import Web3, HTTPProvider ad

Mumu的博客 2万+

MetaMask与Web3中智能合约调用

MetaMask 是一款浏览器插件钱包,简称小狐狸,可以连接以太坊实现购买NFT,只需添加至浏览器扩展程序即可使用,非常方便。 下载链接要验证浏览器是否正在运行 MetaMask 当安装成功后可以直接调用MetaMask进行登录 method中的eth_requestAccounts其实就是Web3中方法web3.eth.requestAccounts,该方法为请求账户(注注注:此方法仅在您使用来自 Metamask等应用程序的注入提供程序时才有效。直接调用无效) 十六进制 十进制 网络 0

qq_44001572的博客 4049

部署智能合约到公链

以太坊公链除了主网,还有多个测试网络。主网(Mainnet)是正式的以太坊网络,里面的以太币是真正有价值的,测试网络中的以太币没有价值,只用于测试。我们最终目标是连接到主网,但先连接到测试网络Kovan,虽然本地区块链网络(Ganache)也能测试,但与公链还是有区别的。...

小鹏linux的博客 1万+

【Web3 开发系列教程—创建你的第一个智能合约(1)】什么是智能合约

什么是智能合约? 以太坊在 2013 年的核心创新是允许开发人员编写称为智能合约的小代码块,这些代码可以部署到以太坊网络,独立于其创建者运行。 在以太坊中,智能合约是用 Solidity 编写的,这是一种设计用于在以太坊虚拟机上运行的高级编程语言。智能合约也成为了区块链开发领域主要的研究方向之一。 智能合约是定义一组规则或“合约”的程序,当用户在区块链上调用时,它会自动执行编码规则。 特别地,一旦部署了智能合约,它就不能被修改或控制。因此,智能合约是运行金融应用程序的理想选择,它们可以作为独立参与者以有保证

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 2821

“智能合约”是如何部署的?

我们都知道,智能合约是区块链网络中各个节点共同遵守的合约,或者说是合同。那么智能合约是如何部署和发挥功能的呢? 智能合约是Nick Szabo在1994年所提出的概念,是一种计算机协议、位于以太坊中的代码和数据的集合。 区块链网络中的节点可以预先编写代码实现一定逻辑,然后通过以太坊虚拟机编译成字节码后存储在以太坊区块链平台以便执行,因此智能合约也拥有在区块链上的唯一地址,当网络中的节点向智能合约所在地址发送交易或满足某些条件后即会触发智能合约代码,智能合约将自动以规定的方式在网络中的每个节点..

XYlittlework的博客 1万+

【Web3 开发系列教程—创建你的第一个智能合约(2)】部署第一个智能合约

如果你是区块链开发的新手并且不知道从哪里开始,或者你只是想了解如何部署智能合约并与之交互,那么本指南适合你。 我们将介绍使用虚拟钱包 (Metamask)、Solidity、Hardhat 和 Alchemy 在 Goerli 测试网络上创建和部署一个简单的智能合约(如果你还不明白其中的任何含义,请不要担心,我们将 解释一下!)。有很多方法可以向以太坊链发出请求。 为简单起见,我们将在 Alchemy 上使用免费帐户(如果你还没有 Alchemy 帐户,请点击在此处免费注册),这是一个区块链开发平台和 AP

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 5938

Java Web3J :使用web3j调用自己的智能合约的方法(教程)

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。可以通过它进行以太坊区块链的开发,而无需为你的应用平台编写集成代码。web3j调用智能合约是web3j使用的关键,当前区块链的核心原理其实很简单:这是智能合约优秀的框架,经过了无数安全的效验,目前绝大多数项目引用此相关依赖。有些函数是固定写法例如claim,deposit,approve等等。

鄙人kunzhi96,感恩遇见! 1万+

【web3】使用web3.js发布并执行智能合约

昨天我们学习了使用 web3.js 库查询链上区块和交易的用法,今天我们来介绍一下使用 web3.js 与智能合约的交互。在学习本节前,你应该对智能合约有一定的了解。智能合约的生命周期包括创建、发布、执行以及销毁。创建:在 Remix 中编写智能合约,编译生成 ABI 和 字节码文件。发布:对应 Remix 中的Deploy按钮的功能,也即 web3.js 中合约实例上的deploy方法。执行:对应web3.js 中合约实例上的call和send方法。销毁:在合约中使用方法销毁指定合约。

小陈的博客 4657

[CTFSHOW]JWT

文章目录前言JWT简介CTFSHOW Web345CTFSHOW Web346前置知识开始做题CTFSHOW Web347CTFSHOW Web348CTFSHOW Web349CTFSHOW Web350前置知识利用WP如何防御 前言 有些师傅向我咨询WP,索性就发了吧,其实早就写好了,只是懒,在github仓库里囤着 JWT简介 可以看看我的Github总结给自己看的,Y4tacker CTFSHOW Web345 首先打开题目,查看源码,接下来访问/admin被跳转回主页啥也没有发生 where is

Y4tacker的博客 6044

Web3 新手如何部署第一个智能合约?

智能合约作为一种定义一组规则的程序或“合约”,当用户在区块链上调用时,会自动执行编码的规则;你可以免费下载并创建 Metamask 帐户,创建帐户时,若你已有一个帐户,请确保切换到右上角的“Goerli 测试网络”(这样我们就不会处理真实资产)。简单来说,我们使用的是 Alchemy 上的免费帐户,这是一个区块链开发者平台和 API,允许我们与以太坊进行通信而无需运行个人节点。这里的两个重要调用是将我们的合约实际写入 Ropsten 链的请求,以及根据哈希值读取有关交易的信息请求(发送交易的典型模式)——

TinTinCommunity的博客 2293

微信小程序消息推送全攻略:从模板消息到订阅消息的实战避坑指南

本文深入解析微信小程序消息推送机制,对比模板消息、订阅消息与客服消息的核心差异与适用场景。重点提供订阅消息从用户授权设计、前端代码实现到后端稳定发送的完整实战指南,并分享提升消息点击率的文案与运营技巧,帮助开发者构建高效、用户友好的消息推送体系。

b3n4m5q6w7的博客 336

NSIDC海冰运动产品-速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

入门级NSIDC海冰运动产品速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

Mluoo的博客 2959

第二部分:Web3的核心技术 4. 智能合约

智能合约是Web3生态中不可或缺的技术组件,它通过代码自动执行协议条款,实现了去中心化、透明和自动化的业务逻辑。智能合约的核心优势包括去中介化、自动化执行和数据不可篡改性,使得各种传统业务操作和合约管理更加高效和安全。智能合约的实现不仅依赖于先进的编程语言如Solidity,还需要区块链平台的支持,以确保合约的部署和执行能够得到有效的保障。

sise_2022的博客 1657

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法

opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!

m0_51437227的博客 935

Windows下python-web3.py、geth、solc的安装使用以及简单的私链连接和智能合约的部署

文章目录一、环境准备geth的安装及简单使用一、安装二、使用1. 创建私链2. 初始化创世区块3. 启动私有链4. Geth 使用1、查询账户列表2、创建新账户3、查询账户余额4、启动或停止挖矿5、解锁账户6、发送以太安装python3.8和安装web3.py安装nodejs以及solc 一、环境准备 使用的环境包括: geth python3.8 web3.py solc geth的安装及简单使用 一、安装 地址:https://geth.ethereum.org/downloads/ 找到对应的操作

17902的博客 5048

工业异常检测评价指标(I-AUROC、PRO等)

模型评价指标:TPR、FPR、Recall、ROC、AUC、AUROC、IoU、PRO、AUPRO等

qq_1532145264的博客 7432

9.6华为OD机试真题 新系统 - 少儿爬山闯关积分游戏 (Java/Py/C/C++/Js/Go)

2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型。

算法大师! 855

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)

java 通过web3j调用部署在测试链上的合约函数(万字详细教程)

幸平的博客 2万+

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5108

Web3j实现智能合约

1 获取凭证 Credentials是我们钱包的凭证,在我们交易和创建智能合约的时候都需要用到。 1.1 创建新凭证 file=WalletUtils.generateFullNewWalletFile(pwd,dir); 返回的file不是全路径,而是该文件的路径名,比如UTC—2017-10-30T12-10-45.516005546Z—5f38056f45091ee992298e53...

跨链技术践行者 1万+

攻克低照度检测难题:YOLOv11主干网络增强新方案PE-YOLO详解

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 106

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HTML页面通过Web3JS连接智能合约并调用其中接口

之前我们学习solidity 并用它编写了智能合约 登上区块链 然后也做了基本的测试 但是 其实在web3时代 前端依旧扮演者非常重要的角色 我们现在就来打通web3 从合约到页面的一个管理首先 我们还是将自己的ganache环境起起来 然后 在我们之前智能合约的项目终端执行 将我们的智能合约部署上去 然后 我们用MetaMask 导入我们ganache环境的第一个用户 然后 我们拿个html文件 编写代码如下 注意 他这里引入的web3.min.js 你们需要本地确实有这个文件 然后

weixin_45966674的博客 2610

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: web3系列———2.以太坊与智能合约
下一篇: web3系列———5.layer2,零知识证明,Rollup,DeFi等(完结)
nothing one
博客等级 码龄6年 691粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值