风靡一时的精灵收藏原来实现起来so easy, 手把手教你亲手创建一个! | 干货
来源 | Adrien BARREAU
编译 | 王柯凝
出品 | 区块链大本营(blockchain_camp)
说起口袋精灵、以太猫、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的使用方法。
说了这么多,你对如何创建一个宠物收藏市场已经有基本的概念了吧?俗话说,光说不练假把式。现在就动起手来开发一款自己的「以太猫」吧!
赠人玫瑰,手有余香,喜欢营长的硬核技术文,就分享给更多需要的小伙伴吧!
— END —
推荐阅读:
猛戳"阅读原文"有惊喜哟!
老铁在看了吗?👇