手把手教你亲手创建区块链版“精灵宝可梦” 干货速收藏

2019-04-01 10:43:41来源:区块链大本营编辑:鹿鸣君

扫一扫

分享文章到微信

扫一扫

关注鹿财经微信公众号

  原标题:手把手教你亲手创建区块链版“精灵宝可梦” 干货速收藏

  说起口袋精灵、以太猫、MLB Crypto Baseball等游戏,你也许不陌生,这些宠物收藏及交易类游戏曾风靡一时。

  也引掀起了区块链世界的一股「宠物热潮」,带起了如加密兔、加密国家、0xgame、Decentraland等一大批类似的作品。

  但如果你想要自己开发一款这样的游戏该如何下手?

  来来来,今天营长就手把手教你一起来实现加密宠物的应用架构!

  我们以能够买卖「口袋精灵(Pokemon)」的交易市场为例, 在这个游戏中,用户可以在以太坊上买卖口袋精灵。因此,我们要做的就是:在以太坊平台上创建一个Web界面,用户可以在这里查看不同种类的口袋精灵,并参与买卖交易。

  好了,别掉队,下面我们就一起动起来!

  创建、发布智能合约,并进行交互

  首先,我们需要用以太坊上智能合约编程语言Solidity创建一个智能合约,开发框架使用Truffle。

  在Truffle框架中,.sol智能合约文件保存在/contract目录下:

  执行truffle compile命令,将/contract目录下的智能合约文件编译成JSON文件,这个JSON文件中包含了智能合约ABI和其他一些数据;

  执行truffle migrate命令,将合约部署到区块链上。

  在合约编写完后,就可以发布了,通常智能合约会发布到以下路径:

  安装节点工具Ganache:这是一个本地私有链,可用于本地开发。

  Rinkeby、Ropsten等测试网络:相当于一个私有测试环境,且免费。

  以太坊主网Mainnet:这才是真正能赚钱的以太坊网络!

  在Truffle中的truffle-config.js配置文件中,我们可以设置不同的网络环境。然后使用truffle migrate命令将智能合约部署到Ropsten测试网络中。

  如何与智能合约进行交互?

  在与智能合约进行交互之前,我们还需要将web3.js库添加到脚本中。不过,如果你用的是react类库,则可以和Drizzle数据库搭配使用。

  在于区块链进行交互时,还得需要一个节点。区块链上的所有数据都存储在每个单独的节点中,因此,我们只需要和其中一个节点进行交互即可。

  在这里,我们用web3.js库与区块链节点进行交互,并执行

  web3.myPokemonContract.getPokemon(1) 

  等操作,就可以为我们提供交互所需要的一切。

  但在Rinkeby、 Ropsten测试环境中会略有不同,因为你并不属于区块链网络的一部分。如果没有网络节点,我们可以使用以下两种方法创建节点:

  使用geth创建节点,并将其连接到测试网络上(Rinkeby,Ropsten等)。然后需要对其进行安装、配置并允许可以从外部对其访问、安全管理等。

  使用fura这样的laaS服务,该服务能维护自己的节点,并为我们提供所需的服务,比如一个便于与区块链进行交互的API。

  创建Web应用程序

  有了智能合约和区块链,你就可以进行“读”和“写”的操作了。

  读:通过 ID得到口袋精灵,得到自己拥有口袋精灵的数量等。

  写:创建一个口袋精灵→把新创建的口袋精灵写入智能合约→将其转移到另一个地址→在智能合约上写入新的拥有者等。

  在这个案例中,我们调用的是getPokemon ()和buy ()函数。

  到这里,我们总结一下,这个架构的基本思路就是:在的口袋精灵市场中,有一个能够从智能合约中收集口袋精灵信息的页面,并向用户展示,引导用户买入宠物精灵。

  还没有大功告成

  操作到了这一步,还没有大功告成,还有一些你必须清楚的情况。

  我们知道区块链有很多优点,比如去中心化、抗审查等,但是同时也存在缺陷——运行速度超级慢!

  仅仅是获取口袋精灵的详细信息,就可能会花费几秒钟的时间。对于区块链来说,良好的用户体验可能真的是一大挑战,因为我们会浪费大把的时间在页面加载上。

  此外,在区块链中「读」数据是免费的,而「写」数据,更新智能合约则需要付费。

  在读数据时,我们可以使用web3.js和getPokemon()函数读取区块链,但这并不包含任何其他额外的更新。

  而“写”数据则不然。根据区块链更新过程所需要的计算力,我们也需要支付一定的费用。此外,在购买项目的时候,需要使用以太币支付。但是,我们并不是非得将信用卡绑定在以太坊钱包中,而是可以使用MetaMask钱包进行支付。

  不过,这又引起了另一个问题,即以太币是如何支付到智能合约中的?

  MetaMask是一款基于浏览器插件的以太坊轻钱包。在购买宠物精灵的时候,我们可以使用web3.js要求MetaMask从自己的以太坊钱包中发送0.0004以太币,然后,MetaMask就会请求用户支付,支付完成之后,这笔交易就成功了。

  另外,使用MetaMask还可以进行一键式安全登录。

  那么,用户必须得用MetaMask进行交易吗?答案是肯定的。我们必须获得终端用户的理解和信任,而MetaMask是一个很好用的以太坊轻钱包。然而,由于那些拥有以太币或比特币的用户之前没有使用过MetaMask钱包,因此,他们对MetaMask非常排斥。

  将去中心化应用中心化

  正如上文所说的那样,区块链的处理速度很慢!

  对于这一问题,唯一的解决方案就是:将去中心化应用程序中心化,即“读”智能合约数据并将其保存在数据库中。我们从区块链上获取数据(很慢),然后通过扩展API(快速的)为用户提供服务。

  使用智能合约的优势在于,它可以产生事件,如:

  emit Pokemon Transfer ({ from: 0XO67465,to: 0x43546})

  或

  emit Pokemon Birth ({ name: Nidoran })

  所以,当收到Birth事件时,就意味着有人调用createPokemon()函数,这时你就可以添加一个新的口袋精灵对数据库进行更新了。

  同样,当收到Transfert事件时,就意味着有人调用buy()函数。同样你也可以在数据库中更新给定口袋精灵的所有者。

  另外,我们也可以使用web3.js对这些事件进行监听,可以通过准备一个专门的服务器监听智能合约来实现。

  它可以是一个CRON任务,也可以托管在Google云、AWS Lambda,甚至是本地服务器上。我们甚至还可以自行选择编码,如Node.JS、Go或Python等。

  确保交易得到确认

  当我们接收到一个事件时,就会得到这笔交易的区块号。

  这里的区块号指的是与已经加到区块链上的交易相关联的区块。这并不意味着交易已经完成,因为这笔交易很有可能会失败,所以我们还得至少等待12个区块,才能确保交易成功。

  在交易完成之前,可以将交易状态设置为「等待(pending)」。举个例子来说,当我们创建一个口袋精灵的时候,可以在数据库中将其状态设置为「等待」,这时候口袋精灵就会展示给用户,但不支持购买。当我们添加完成以后,就可以覆盖一张卡片,告诉用户可以进行交易了。

  而至于服务器的架构,既然前文说到我们已经将应用程序中心化了,就可以使用API更快地向用户提供去中心化应用程序的数据,而数据库就好比是智能合约的一面镜子。



  结束语

  总结一下,在以太坊平台上创建一个宠物收藏应用,要做到以下两件事:

  区块链的运行速度很慢,你不可能要求应用能够及时获取数据,并及时展示给用户。解决方案就是,创建一个事件处理器,来监听智能合约事件,并将所有的数据填充到一个数据库中,这就好比是一个镜像区块链。这样一来,我们就可以通过API更快的为用户提供数据了

  MetaMask是强制用户使用的,这可能会让一些用户不太舒服,所以为了保证一个好的用户体验,******先向用户详细介绍MetaMask的使用方法。

  说了这么多,你对如何创建一个宠物收藏市场已经有基本的概念了吧?俗话说,光说不练假把式。现在就动起手来开发一款自己的「以太猫」吧!

 

     投稿邮箱:lukejiwang@163.com   详情访问鹿财经:http://www.lucaijing.com.cn

相关推荐
一文读懂Libra白皮书的弦外之音 Facebook教你玩转区 一文读懂Libra白皮书的弦外之音 Facebook教你玩转区

原标题:一文读懂Libra白皮书的弦外之音 Facebook教你玩转区块链 6月18日, Face

区块链2019-06-24