国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

web3系列———4.編寫第一個(gè)智能合約并發(fā)布到鏈上

這篇具有很好參考價(jià)值的文章主要介紹了web3系列———4.編寫第一個(gè)智能合約并發(fā)布到鏈上。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本篇教程為在以太坊區(qū)塊鏈上發(fā)布一個(gè)智能彩票合約,活動(dòng)期間用戶可充值一定金額的以太幣到合約地址,活動(dòng)結(jié)束進(jìn)行開獎(jiǎng),隨機(jī)從參與用戶中抽取3人,平分獎(jiǎng)池獎(jiǎng)金。(分為上下兩篇)(本篇為下)

教程思路:

  1. 新建以太坊錢包
  2. 充值一定數(shù)額ETH作為合約發(fā)布汽油費(fèi)
  3. Remix編寫solidity智能合約
  4. 發(fā)布到鏈上

再次明確合約發(fā)布的流程:

用solidity或Vyper編寫好智能合約代碼=>編譯為EVM可執(zhí)行的字節(jié)碼=>打包整個(gè)交易廣播給以太坊的某些節(jié)點(diǎn)=>等待其被放入某個(gè)區(qū)塊=>完成


編寫Solidity智能合約:

Remix是什么:

Remix是一個(gè)專門編寫智能合約的 WebIDE(web集成環(huán)境),支持Solidity和Vyper,可從瀏覽器直接訪問,并且連接到 MetaMask從而發(fā)布交易。
所以我們只需要編寫智能合約的代碼,Remix會(huì)自動(dòng)幫我們編譯為EVM字節(jié)碼,發(fā)布到區(qū)塊鏈中。
跳轉(zhuǎn)Remix
在自動(dòng)幫我們創(chuàng)建好的contracts目錄下新建Lottery.sol:
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法

代碼思路:

構(gòu)造函數(shù):

  1. 設(shè)置合約擁有者為部署合約的用戶。
  2. 傳入彩票的活動(dòng)的持續(xù)時(shí)間,
  3. 將彩票活動(dòng)標(biāo)記為False(未結(jié)束)

用戶參與函數(shù):

  1. 允許任何用戶調(diào)用
  2. 要求至少0.1個(gè)ETH才能參與活動(dòng)
  3. 檢查活動(dòng)是否結(jié)束
  4. 活動(dòng)未結(jié)束=>將參與用戶的地址添加到參與者組中
  5. 觸發(fā)彩票參與事件=>記錄日志

彩票結(jié)束函數(shù):

  1. 合約擁有者可調(diào)用
  2. 檢查是否已到結(jié)束時(shí)間
  3. 檢查彩票活動(dòng)是否已標(biāo)記為False(未結(jié)束)
  4. 檢查是否有足夠的參與者
  5. 將彩票活動(dòng)標(biāo)記為True(已結(jié)束)
  6. 開獎(jiǎng),從參與者數(shù)組中挑選三人
  7. 獎(jiǎng)金轉(zhuǎn)賬給中獎(jiǎng)?wù)?/li>
  8. 觸發(fā)彩票結(jié)束事件=>記錄日志
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 定義一個(gè)彩票合約
contract Lottery {
    address public owner; // 合約的擁有者
    address payable[] public participants; // 參與彩票的用戶數(shù)組
    uint256 public lotteryEndTime; // 彩票活動(dòng)的結(jié)束時(shí)間
    bool public lotteryEnded; // 彩票活動(dòng)是否已結(jié)束的標(biāo)志

    // 定義一個(gè)事件,當(dāng)用戶參與彩票時(shí)觸發(fā)
    event LotteryEnter(address indexed participant);
    // 定義一個(gè)事件,當(dāng)彩票結(jié)束時(shí)觸發(fā),記錄中獎(jiǎng)?wù)叩刂?    event LotteryEnd(address winner1, address winner2, address winner3);

    // 構(gòu)造函數(shù),設(shè)置彩票活動(dòng)的持續(xù)時(shí)間
    constructor(uint _durationMinutes) {
        owner = msg.sender; // 設(shè)置合約擁有者為部署合約的用戶
        lotteryEndTime = block.timestamp + (_durationMinutes * 1 minutes); // 計(jì)算彩票活動(dòng)的結(jié)束時(shí)間
        lotteryEnded = false; // 初始化彩票活動(dòng)未結(jié)束的標(biāo)志
    }

    // 允許用戶參與彩票的函數(shù)
    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"); // 檢查彩票活動(dòng)是否已結(jié)束
        require(!lotteryEnded, "Lottery already ended"); // 檢查彩票活動(dòng)是否已標(biāo)記為結(jié)束
        participants.push(payable(msg.sender)); // 將用戶添加到參與者數(shù)組
        emit LotteryEnter(msg.sender); // 觸發(fā)參與彩票的事件
    }

    // 結(jié)束彩票活動(dòng)的函數(shù),只能由合約擁有者調(diào)用
    function endLottery() public {
        require(msg.sender == owner, "Only owner can end the lottery"); // 只有合約擁有者可以結(jié)束彩票活動(dòng)
        require(block.timestamp >= lotteryEndTime, "Lottery not yet ended"); // 檢查彩票活動(dòng)是否已到結(jié)束時(shí)間
        require(!lotteryEnded, "Lottery already ended"); // 檢查彩票活動(dòng)是否已標(biāo)記為結(jié)束
        require(participants.length >= 3, "Not enough participants"); // 檢查是否有足夠的參與者

        lotteryEnded = true; // 標(biāo)記彩票活動(dòng)為已結(jié)束
        uint256 prize = address(this).balance / 3; // 計(jì)算每個(gè)中獎(jiǎng)?wù)叩莫?jiǎng)金
        // 為了避免重復(fù)中獎(jiǎng),我們需要一個(gè)方法來確保每個(gè)中獎(jiǎng)?wù)呤俏ㄒ坏?        // 以下是一個(gè)簡單的解決方案,但請注意,這并不是一個(gè)安全的隨機(jī)數(shù)生成方法
        // 在生產(chǎn)環(huán)境中,應(yīng)該使用更安全的隨機(jī)數(shù)生成方法,如Chainlink VRF
        address[3] memory winnersAddresses; // 創(chuàng)建一個(gè)固定大小為3的地址數(shù)組來存儲(chǔ)中獎(jiǎng)?wù)叩刂?        uint256[] memory winners = new uint256[](3); // 創(chuàng)建一個(gè)大小為3的數(shù)組來存儲(chǔ)中獎(jiǎng)?wù)叩乃饕?        for (uint i = 0; i < 3; i++) {
            uint256 winnerIndex;
            bool isUnique;
            do {
                winnerIndex = random() % participants.length; // 隨機(jī)選擇一個(gè)參與者作為中獎(jiǎng)?wù)?                isUnique = true; // 假設(shè)選中的參與者是唯一的
                for (uint j = 0; j < i; j++) {
                    if (winners[j] == winnerIndex) {
                        isUnique = false; // 如果已經(jīng)選中過,標(biāo)記為不唯一
                        break;
                    }
                }
            } while (!isUnique); // 如果不唯一,重新選擇
            winners[i] = winnerIndex; // 記錄中獎(jiǎng)?wù)叩乃饕?            winnersAddresses[i] = participants[winnerIndex]; // 記錄中獎(jiǎng)?wù)叩牡刂?            participants[winnerIndex].transfer(prize); // 將獎(jiǎng)金轉(zhuǎn)賬給中獎(jiǎng)?wù)?        }
        // 循環(huán)結(jié)束,觸發(fā)彩票結(jié)束的事件
        emit LotteryEnd(winnersAddresses[0], winnersAddresses[1], winnersAddresses[2]);

    }
    
    // 生成隨機(jī)數(shù)的私有函數(shù),用于選擇中獎(jiǎng)?wù)?    function random() private view returns (uint) {
        // 使用區(qū)塊難度、時(shí)間戳和參與者數(shù)組作為種子生成隨機(jī)數(shù)
        return uint(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, participants)));
    }
}

在Solidity中,事件(Event)是智能合約的一種機(jī)制,用于在區(qū)塊鏈上記錄日志信息。當(dāng)特定的函數(shù)被執(zhí)行時(shí),可以觸發(fā)這些事件,并將信息記錄到區(qū)塊鏈上。這些記錄是不可變的,且可以被區(qū)塊鏈上的任何人查詢,但不會(huì)影響區(qū)塊鏈的狀態(tài)。
上述代碼中隨機(jī)數(shù)生成方法不夠安全,在實(shí)際應(yīng)用中,應(yīng)該使用專門的隨機(jī)數(shù)服務(wù),如Chainlink VRF,以確保公平性和安全性。


合約如何發(fā)布:

編譯:

點(diǎn)擊代碼左上綠色三角,編譯通過:
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法

連接到MetaMask:

默認(rèn)發(fā)布環(huán)境為Remix為我們提供的虛擬機(jī),可在虛擬環(huán)境測試無誤后再正式發(fā)布。
我們點(diǎn)擊切換到Inject Provider-MetaMask環(huán)境,錢包自動(dòng)彈出:
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法

連接成功后,左側(cè)可以看到我們的賬戶地址、余額,汽油費(fèi)上限。在Deploy右側(cè)可以看到我們在構(gòu)造函數(shù)中設(shè)置的活動(dòng)持續(xù)時(shí)間,設(shè)置為60min,點(diǎn)擊Deploy發(fā)布。
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法

部署成功后,可以在已部署合同中看到一條記錄,點(diǎn)開可以看到我們的智能合約,函數(shù)顯示在左側(cè)供調(diào)用。

也可以打開Etherscan進(jìn)行更詳細(xì)的查看:
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法
remix編寫的智能合約如何部署到區(qū)塊鏈上,web3,智能合約,區(qū)塊鏈,比特幣,以太坊,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-852437.html

到了這里,關(guān)于web3系列———4.編寫第一個(gè)智能合約并發(fā)布到鏈上的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Web3 solidity編寫交易所合約 編寫ETH和自定義代幣存入邏輯 并帶著大家手動(dòng)測試

    Web3 solidity編寫交易所合約 編寫ETH和自定義代幣存入邏輯 并帶著大家手動(dòng)測試

    上文 Web3 敘述交易所授權(quán)置換概念 編寫transferFrom與approve函數(shù)我們寫完一個(gè)簡單授權(quán)交易所的邏輯 但是并沒有測試 其實(shí)也不是我不想 主要是 交易所也沒實(shí)例化 現(xiàn)在也測試不了 我們先運(yùn)行 ganache 啟動(dòng)一個(gè)虛擬的區(qū)塊鏈環(huán)境 先發(fā)布 在終端執(zhí)行 如果你跟著我一步一步來的 那編

    2024年02月13日
    瀏覽(26)
  • 為 Web3 項(xiàng)目撰寫智能合約(Web3項(xiàng)目三實(shí)戰(zhàn)之二)

    時(shí)間像是在我們身邊悄然而過,而我們的 Web3項(xiàng)目實(shí)戰(zhàn) 系列也來到了第三個(gè) Web3 項(xiàng)目。若正在屏幕前瀏覽本篇文章的您,或是從 Web3項(xiàng)目一 開篇之作,一直跟隨著我的步伐來到了本文,想必您對于 Web3 與 Web2 的區(qū)別,有了最為深刻的感觸了! 當(dāng)然咯,前提是您先前或者說是當(dāng)

    2024年01月18日
    瀏覽(22)
  • 怎么在Web3中創(chuàng)建智能合約

    怎么在Web3中創(chuàng)建智能合約

    智能合約是在區(qū)塊鏈上運(yùn)行并在 web3 生態(tài)系統(tǒng)中啟用去中心化應(yīng)用程序 (dapps) 的自動(dòng)執(zhí)行協(xié)議。Web3 是指下一代互聯(lián)網(wǎng)的術(shù)語,用戶可以更好地控制自己的數(shù)據(jù)、身份和資產(chǎn),并且可以在沒有中介的情況下直接相互交互。 本篇文章將介紹如何使用 JavaScript 和 Solidity(最流行的

    2024年02月07日
    瀏覽(26)
  • 智能合約:Web3的商業(yè)合作新模式

    智能合約:Web3的商業(yè)合作新模式

    隨著區(qū)塊鏈技術(shù)的發(fā)展,智能合約在Web3時(shí)代嶄露頭角,成為商業(yè)合作中的全新模式。這一技術(shù)不僅重新定義了商業(yè)合作的方式,還為各行各業(yè)帶來了更加高效、透明和安全的商務(wù)交往。本文將深入探討智能合約在Web3時(shí)代的嶄新商業(yè)合作模式,以及它對商業(yè)領(lǐng)域的深遠(yuǎn)影響。

    2024年01月22日
    瀏覽(34)
  • DAPP開發(fā)(一)——web3.0和智能合約

    web1.0~3.0,很多年前,互聯(lián)網(wǎng)沒有那么發(fā)達(dá),剛出來的時(shí)候,僅僅只能在網(wǎng)上瀏覽觀看信息,這就是1.0,后來出現(xiàn)了很多的軟件,人們不僅可以瀏覽還可以發(fā)表自己的看法,手機(jī)app百花齊放,每個(gè)應(yīng)用都有自己的數(shù)據(jù)庫,存儲(chǔ)數(shù)據(jù),這就是2.0,現(xiàn)如今出現(xiàn)了3.0,去中心化的思想

    2024年02月05日
    瀏覽(22)
  • Web3 通過truffle 腳本進(jìn)行智能合約測試

    Web3 通過truffle 腳本進(jìn)行智能合約測試

    上文 Web3 處理智能合約部署到本地區(qū)塊鏈,并在本地進(jìn)行測試中 我們講解了部署智能合約 然后在終端測試的方法 但上文那種終端測試 其實(shí)并不保險(xiǎn) 而且也比較不專業(yè) 對于這個(gè) 有一個(gè)mocha測試 這是基于node部署環(huán)境的一種環(huán)境測試 但是這個(gè)需要一定的基礎(chǔ) 大家可以專門去學(xué)

    2024年02月13日
    瀏覽(22)
  • Web3本地搭建truffle智能合約開發(fā)環(huán)境

    Web3本地搭建truffle智能合約開發(fā)環(huán)境

    之前的幾篇文章 我們是成功的操作了我們本地區(qū)塊鏈的 那么 本文 我們就來說說智能合約 啊 不容易啊 扯了這么久 終于到這了 智能合約是部署在區(qū)塊鏈上 不可逆的 一種去中心化的程序,他沒有任何第三方公司來管理這個(gè)程序和數(shù)據(jù) 然后 還有就是怎么連接到區(qū)塊鏈上的智能

    2024年02月12日
    瀏覽(21)
  • MetaMask與Web3中智能合約調(diào)用(2)

    MetaMask與Web3中智能合約調(diào)用(2)

    智能合約交易區(qū)別于點(diǎn)對點(diǎn)交易,智能合約交易只需付費(fèi)給礦工費(fèi)用,也就是gas fee,是支付給礦工的手續(xù)費(fèi),當(dāng)我們在以太坊區(qū)塊鏈上進(jìn)行轉(zhuǎn)賬時(shí),礦工要把我們的交易打包并放上區(qū)塊鏈,才能使交易完成,在這過程中會(huì)消耗區(qū)塊鏈的運(yùn)算資源,所以要支付費(fèi)用 這個(gè)過程為

    2024年01月16日
    瀏覽(29)
  • Web3.0入口-MPC錢包和智能合約錢包

    Web3.0大規(guī)模普及,需要解決一些關(guān)鍵問題,包括錢包私鑰帶來的一個(gè)用戶體驗(yàn)問題與兩個(gè)安全問題。 1. 一個(gè)用戶體驗(yàn)問題 : 助記詞與私鑰難記、難保存,導(dǎo)致用戶使用門檻過高 2. 兩個(gè)安全問題 : 助記詞和私鑰的泄露,導(dǎo)致資產(chǎn)被盜。 助記詞和私鑰的丟失,導(dǎo)致資產(chǎn)丟失。

    2024年02月02日
    瀏覽(27)
  • Web3 智能合約通過數(shù)組方式存儲(chǔ)更多學(xué)生數(shù)據(jù)

    Web3 智能合約通過數(shù)組方式存儲(chǔ)更多學(xué)生數(shù)據(jù)

    之前的文章 Web3 在Truffle項(xiàng)目中編寫出自己的第一個(gè)solidity智能合約帶大家寫了一個(gè)相對撿漏的智能合約 這樣 每次 我們set 后 都會(huì)將原來的數(shù)據(jù)覆蓋掉了 那么 有些人可能會(huì)想 那我們弄個(gè)數(shù)組 將新的數(shù)據(jù)全部加到數(shù)組里不就行了嗎? 這個(gè)想法其實(shí)就很不錯(cuò) 我們可以基于這個(gè)

    2024年02月15日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包