实验五:认识智能合约&线上 IDE 实现 Solidity 合约

实验概述

本实验参考自以太坊中的以太猫游戏和 Loom Network 团队的智能合约教学案例,进行 Solidity 智能合约入门与 remix 在线 IDE 使用练习,通过构建一个“宠物游戏”来学习智能合约的编写,在实验中穿插 Solidity 基础知识。

实验 5-1:生成宠物,并存入区块链上的宠物数据库

实现效果:

  • 在 JavaScript VM 环境下,部署 AnimalIncubators 合约。

    image-20231026132826738
  • 创建三个分别叫Drogon、Rheagal、Viserion 的宠物,并展示其DNA。

    image-20231026132936948image-20231026133050329image-20231026133121360

实验 5-2:Solidity 进阶——宠物成长系统

实现效果:

  • 部署 AnimalFeeding 合约

    image-20231026133757683
  • 以三个用户身份添加 Drogon、Rheagal、Viserion 的宠物

    • Drogon用户:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
      image-20231026134045179
    • Rheagal用户:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
      image-20231026134136863
    • Viserion用户:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
      image-20231026134241336
  • 同一账户只可调用一次 createRandomAnimal

    • 再次使用Viserion用户(0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db)调用createRandomAnimal,调用如下所示失败。

      image-20231026134423447

  • 让 Drogon 宠物进食成长一次,展示新宠物的主人与 Drogon 相同

    • 切换回Drogon用户(0xca35b7d915458ef540ade6068dfe2f44e8fa733c)
    • 调用feedOnFood(0,2023),查看新宠物的主人:

      image-20231026135041554

拓展实验 5-3:Solidity 高阶理论

实现效果:

  • 部署 AnimalHelper 合约

    image-20231026140734280
  • 展示宠物的冷却时间:

    • 根据要求,创建宠物后可进食一次,每两次进食之间必须等待 1min
      • 创建宠物:
        image-20231026140803486
      • 进食第一次,成功,冷却时间重置
        image-20231026140839168 image-20231026141210804
      • 进食第二次,失败,冷却时间未重置

        image-20231026141014210

  • 成功实现 getAnimalsByOwner 函数

    • 喂食后,Drogon用户所拥有所有宠物ID是0和1。

    image-20231026141300823

拓展实验 5-4:solidity 高阶篇

实现效果:

  • 部署 AnimalAttack 合约

    image-20231026141852930
  • 成功升级,并改名

    • 首先两个用户分别创建两个宠物
      • Drogon用户(0xca35b7d915458ef540ade6068dfe2f44e8fa733c)(owner):
        image-20231026142024852
      • Rhealgal用户(0x14723a09acff6d2a60dcdf7aa4aff308fddc160c):
        image-20231026142102098
    • Rhealgal用户通过氪金升级自己的宠物至level 2
      image-20231026142135472 image-20231026142214276
    • 满足等级要求,Rhealgal用户将宠物名改为“Rhealgal_changed”
      image-20231026142325449
  • 实现一次提现操作:

    • 由于Rhealgal用户有氪金行为,Drogon用户(owner)可以从合约powerUp中提现
      • 记录当前Drogon用户余额:
        image-20231026142607325
      • 调用withdraw合约提现,提现成功:

        image-20231026142651742

        image-20231026142709291

      • 提现后Drogon用户余额,可以看到余额增加了0.001 ether:
        image-20231026142739572
  • 实现战斗升级系统

    • 对于先手胜率75%:合约中生成0-99的随机数,检测随机数,若为1(mod 4)1(mod~4)则失败,否则成功。
    • Drogon用户(owner)选择宠物Drogon对Rhealgal用户的宠物Rhealgal进行攻击

      image-20231026143925843

    • 对战中,发起方Drogon胜利,winCount加1,level升为2,冷却时间重置

      image-20231026144023056

    • 同时,Rhealgal失败,lossCount加1,level未变,冷却时间重置

      image-20231026144118867

    • 多次攻击后,Drogon胜利共6次,失败1次:可以看到level为7,证明了失败时什么都没发生,只进行了冷却时间重置

      image-20231026144330165

      image-20231026144431818