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

这篇具有很好参考价值的文章主要介绍了web3系列———4.编写第一个智能合约并发布到链上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇教程为在以太坊区块链上发布一个智能彩票合约,活动期间用户可充值一定金额的以太币到合约地址,活动结束进行开奖,随机从参与用户中抽取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:
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法

代码思路:

构造函数:

  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,以确保公平性和安全性。


合约如何发布:

编译:

点击代码左上绿色三角,编译通过:
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法

连接到MetaMask:

默认发布环境为Remix为我们提供的虚拟机,可在虚拟环境测试无误后再正式发布。
我们点击切换到Inject Provider-MetaMask环境,钱包自动弹出:
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法

连接成功后,左侧可以看到我们的账户地址、余额,汽油费上限。在Deploy右侧可以看到我们在构造函数中设置的活动持续时间,设置为60min,点击Deploy发布。
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法

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

也可以打开Etherscan进行更详细的查看:
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法
remix编写的智能合约如何部署到区块链上,web3,智能合约,区块链,比特币,以太坊,算法文章来源地址https://www.toymoban.com/news/detail-852437.html

到了这里,关于web3系列———4.编写第一个智能合约并发布到链上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

    上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 如果你跟着我一步一步来的 那编

    2024年02月13日
    浏览(29)
  • 为 Web3 项目撰写智能合约(Web3项目三实战之二)

    时间像是在我们身边悄然而过,而我们的 Web3项目实战 系列也来到了第三个 Web3 项目。若正在屏幕前浏览本篇文章的您,或是从 Web3项目一 开篇之作,一直跟随着我的步伐来到了本文,想必您对于 Web3 与 Web2 的区别,有了最为深刻的感触了! 当然咯,前提是您先前或者说是当

    2024年01月18日
    浏览(38)
  • 怎么在Web3中创建智能合约

    智能合约是在区块链上运行并在 web3 生态系统中启用去中心化应用程序 (dapps) 的自动执行协议。Web3 是指下一代互联网的术语,用户可以更好地控制自己的数据、身份和资产,并且可以在没有中介的情况下直接相互交互。 本篇文章将介绍如何使用 JavaScript 和 Solidity(最流行的

    2024年02月07日
    浏览(42)
  • 智能合约:Web3的商业合作新模式

    随着区块链技术的发展,智能合约在Web3时代崭露头角,成为商业合作中的全新模式。这一技术不仅重新定义了商业合作的方式,还为各行各业带来了更加高效、透明和安全的商务交往。本文将深入探讨智能合约在Web3时代的崭新商业合作模式,以及它对商业领域的深远影响。

    2024年01月22日
    浏览(41)
  • MetaMask与Web3中智能合约调用(2)

    智能合约交易区别于点对点交易,智能合约交易只需付费给矿工费用,也就是gas fee,是支付给矿工的手续费,当我们在以太坊区块链上进行转账时,矿工要把我们的交易打包并放上区块链,才能使交易完成,在这过程中会消耗区块链的运算资源,所以要支付费用 这个过程为

    2024年01月16日
    浏览(39)
  • Web3 通过truffle 脚本进行智能合约测试

    上文 Web3 处理智能合约部署到本地区块链,并在本地进行测试中 我们讲解了部署智能合约 然后在终端测试的方法 但上文那种终端测试 其实并不保险 而且也比较不专业 对于这个 有一个mocha测试 这是基于node部署环境的一种环境测试 但是这个需要一定的基础 大家可以专门去学

    2024年02月13日
    浏览(34)
  • DAPP开发(一)——web3.0和智能合约

    web1.0~3.0,很多年前,互联网没有那么发达,刚出来的时候,仅仅只能在网上浏览观看信息,这就是1.0,后来出现了很多的软件,人们不仅可以浏览还可以发表自己的看法,手机app百花齐放,每个应用都有自己的数据库,存储数据,这就是2.0,现如今出现了3.0,去中心化的思想

    2024年02月05日
    浏览(32)
  • Web3本地搭建truffle智能合约开发环境

    之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序,他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能

    2024年02月12日
    浏览(30)
  • Web3 React项目Dapp获取智能合约对象

    上文Web3 整理React项目 导入Web3 并获取区块链信息中,我们在react搭建的dapp中简单拿到了我们区块链中的账号授权信息 那 我们继续 先终端运行 将ganache环境起起来 然后 我们运行 dapp 拿到授权列表 回到上文结束的一个状态 然后 我们发布一下自己的智能合约 在我们的项目终端

    2024年02月06日
    浏览(38)
  • Web3.0入口-MPC钱包和智能合约钱包

    Web3.0大规模普及,需要解决一些关键问题,包括钱包私钥带来的一个用户体验问题与两个安全问题。 1. 一个用户体验问题 : 助记词与私钥难记、难保存,导致用户使用门槛过高 2. 两个安全问题 : 助记词和私钥的泄露,导致资产被盗。 助记词和私钥的丢失,导致资产丢失。

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包