十一课堂|通过小游戏学习Ethereum DApps编程(5)

image

1

ERC721 tokens

在这个游戏里面,我们使用ERC721 tokens标准,通常的情况下,使用的是ERC20 tokens。

有兴趣的童学可以研究一下两个标准的不同。

ERC721 tokens有两种方式交易"金币"的方式。虽然在这里我用的"金币"一词,但是可以是如何东西,你的加密猫,你的无敌英雄角色。

下面的 transfer 和 approve + takeOwnership 是ERC721 tokens标准里面的两个交易接口。完成的功能相同。

function transfer(address _to, uint256 _tokenId) public;

function approve(address _to, uint256 _tokenId) public;

function takeOwnership(uint256 _tokenId) public;

2

Event

Event的调用方法:

定义一个Event

contract ERC721 {

  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);

  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);

  function ownerOf(uint256 _tokenId) public view returns (address _owner);

  function transfer(address _to, uint256 _tokenId) public;

  function approve(address _to, uint256 _tokenId) public;

  function takeOwnership(uint256 _tokenId) public;

}

调用一个Event

function _transfer(address _from, address _to, uint256 _tokenId) private {

    ownerZombieCount[_to]++;

    ownerZombieCount[_from]--;

    zombieToOwner[_tokenId] = _to;

    Transfer(_from, _to, _tokenId);

  }

3

mapping

定义一个mapping

mapping (uint => address) public zombieToOwner;

   mapping (address => uint) ownerZombieCount;

4

require

require(newOwner != address(0));

5

SafeMath

OpenZeppelin提供了一个库:SafeMath,可以解决overflow问题。
overflow也叫做溢出。

Let’s say we have a uint8, which can only have 8 bits. That means the largest number we can store is binary 11111111 (or in decimal, 2^8 - 1 = 255).

可以这样使用:

using SafeMath for uint256;

uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8 a自动成为函数的第一个参数

uint256 c = a.mul(2); // 5 * 2 = 10

这里是原代码:

library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {

    if (a == 0) {

      return 0;

    }

    uint256 c = a * b;

    assert(c / a == b);

    return c;

  } 

 function div(uint256 a, uint256 b) internal pure returns (uint256) {

    // assert(b > 0); // Solidity automatically throws when dividing by 0

    uint256 c = a / b;

    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;

  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) { 

   assert(b <= a);

    return a - b;

  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {

    uint256 c = a + b;

    assert(c >= a);

    return c;

  }

}

可以这样代替已有的算数符号

Ex. Instead of doing:
myUint++;

We would do:
myUint = myUint.add(1);

6

自定义 library

在Solidity里面,可以将几个library定义到同一文件里面。
可以这样调用:

using SafeMath16 for uint16;

/**

 * @title SafeMath16

 * @dev SafeMath library implemented for uint16

 */

library SafeMath16 {

  function mul(uint16 a, uint16 b) internal pure returns (uint16) {

    if (a == 0) {

      return 0;

    }

    uint16 c = a * b;

    assert(c / a == b);

    return c;

  }

  function div(uint16 a, uint16 b) internal pure returns (uint16) {

    // assert(b > 0); // Solidity automatically throws when dividing by 0

    uint16 c = a / b;

    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;

  }

  function sub(uint16 a, uint16 b) internal pure returns (uint16) {

    assert(b <= a);

    return a - b;

  }

  function add(uint16 a, uint16 b) internal pure returns (uint16) {

    uint16 c = a + b;

    assert(c >= a);

    return c;

  }

}

我们终于完成了这一章节的学习。下一章节我们要学习如何发布到ETH网络上。

cryptozombies

image

image

拓展阅读:

十一课堂|通过小游戏学习Ethereum DApps编程(1)

十一课堂|通过小游戏学习Ethereum DApps编程(2)

十一课堂|通过小游戏学习Ethereum DApps编程(3)

十一课堂|通过小游戏学习Ethereum DApps编程(4)

本系列文章作者:HiBlock区块链技术布道群-Amywu

原文发布于简书

加微信baobaotalk_com,加入技术布道群

北京blockathon回顾:

Blockathon(北京):48小时极客开发,区块松11个现场交付项目创意公开

成都blockathon回顾:

Blockathon2018(成都站)比赛落幕,留给我们这些区块链应用思考

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值