44

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

 5 years ago
source link: https://www.jinse.com/blockchain/338310.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

f67V3m3.jpg!web

来源 | Adrien BARREAU

编译 | 王柯凝

出品 | 区块链大本营(blockchain_camp)

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

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

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

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

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

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

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

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

iymMRbe.jpg!web

在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 () 函数。

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

qMJjiyf.jpg!web

还没有大功告成

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

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

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

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

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

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

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

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

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

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

将去中心化应用中心化

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

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

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

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

emit Pokemon Birth ({ name: Nidoran })

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

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

mqYnaqN.jpg!web

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

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

确保交易得到确认

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

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

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

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

bU73AnZ.jpg!web

结束语

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

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

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

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

赠人玫瑰,手有余香,喜欢营长的硬核技术文,就分享给更多需要的小伙伴吧!

— END —


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK