区块链研究实验室|如何在Loom的BaseChain创建和部署智能合约

  • 时间:
  • 浏览:69
  • 来源:区块链技术网

简 介

在本文中,您将学习Loom Network及其优势。此外,您可以按照以下步骤从头开始为小型游戏创建智能合约,并将其部署到Loom的BaseChain中。如果您真的很喜欢,您还可以在自己的Unity游戏中使用此智能合约。

Loom Network

Loom Network为开发人员提供了构建高性能面向用户的dapp所需的可扩展性和可用性。

Loom Network为以太坊提供了一个第二层解决方案,具有以下主要优点:

1. 1-3秒确认时间。2. 用户无需支付气体费。3. 避免主网交易拥塞。4. 与MetaMask和其他主要以太坊钱包完全兼容。

创建智能合约

如果您是创建以Solidity编写的智能合约的初学者,我强烈建议您使用Remix IDE来开发和使用智能合约。它可以轻松地测试某些功能。Remix还会为任何智能合约创建合约ABI和bytecode-您以后需要将它们集成到游戏客户端中。

对于高级编码人员或专家,我建议使用Truffle。您还可以遵循Pranshu Rastogi的本指南,使用Truffle为Loom创建和部署智能合约。

我们将创建的智能合约是针对使用Game Engine Unity创建的小型单人原型游戏,玩家可以在其中收集硬币。 这些硬币实际上是免费创建并保存在Loom区块链上的!

pragmasolidity>=0.5.0<0.6.0;///@authorJulianSakowski///@titleAprototypegamecontractcontractCoinCollector{///@devTheamountofcoinsrequiredtowinthegame.uint256privatewinCondition;///@devMapsthesubscriberindextoanaddress.mapping(address=>uint256)privatecoinCount;/**@devEmitsongamestart.*@param_playerTheaddressoftheplayerstartingthegame.*/eventonStartGame(address_player);/**@devEmitsonacoinbeingcollected.*@param_playerTheaddressoftheplayercollectingthecoin.*@param_coinCountThecurrentcollectedcoincountoftheplayer.*/eventonCoinCollected(address_player,uint256_coinCount);/**@devEmitsongameend.*@param_playerTheaddressoftheplayerendingthegame.*/eventonEndGame(address_player);/**@noticeCreatesthesmartcontractandinitializesthewincondition.*@devTheconstructor,whichinitializesthewincondition.*@param_winConditionTheamountofcoinsrequiredtowinagame.*/constructor(uint256_winCondition)public{winCondition=_winCondition;}/**@noticeAnyplayercanstartagameforhimorherself.*@devResetsthecoinCountformsg.sender.*/functionstartGame()external{coinCount[msg.sender]=0;emitonStartGame(msg.sender);}/**@noticeAnyplayercancollectcoins.*@devIncreasesthecoincountforthemsg.senderandchecksforthevalidwincondition.*/functioncollectCoin()external{coinCount[msg.sender]+=1;emitonCoinCollected(msg.sender,coinCount[msg.sender]);if(coinCount[msg.sender]==winCondition){emitonEndGame(msg.sender);}}/**@noticeShowsthecountofcollectedcoinsfortheactiveplayer.*@devReturnsthecoincountcollectedbythemsg.sender.*@returnThecountofcollectedcoins.*/functiongetCoinCount()externalviewreturns(uint256){returncoinCount[msg.sender];}}

一步一步来

让我们先创建此原型游戏智能合约。

首先让我们创建一个通用的智能合约

pragmasolidity>=0.5.0<0.6.0;contractCoinCollector{}注意,我们定义了编译器版本的范围。它必须在版本5.0和6.0之间。推荐这样做是因为较低的版本可能包含安全问题,而较高的版本可能会破坏合同代码。我们的合同称为CoinCollector。

让我们包括一个获胜条件,即玩家赢得游戏需要收集的硬币数量。

pragmasolidity>=0.5.0<0.6.0;contractCoinCollector{uint256privatewinCondition;constructor(uint256_winCondition)public{winCondition=_winCondition;}}注意,我们创建了一个全局变量“ winCondition”,其类型为uint256(正自然数)。此外,我们包括了构造函数。 一旦部署了智能合约,构造函数就是一个特殊功能。在这里,我们在参数中定义实际的获胜条件。让我们开始吧。10.为了更好的概述,让参数始终以下划线开头,以便您可以区分参数和全局变量。

我们的功能:

pragmasolidity>=0.5.0<0.6.0;contractCoinCollector{uint256privatewinCondition;mapping(address=>uint256)privatecoinCount;constructor(uint256_winCondition)public{winCondition=_winCondition;}functionstartGame()external{coinCount[msg.sender]=0;}functioncollectCoin()external{coinCount[msg.sender]+=1;}functiongetCoinCount()externalviewreturns(uint256){returncoinCount[msg.sender];}}注意,除了构造函数,我们现在还创建了三个函数。我们希望能够开始游戏,收集硬币并始终接收有关已经收集了多少硬币的信息。我们为每个函数提供了可见性修饰符。可能的修饰符是public,private,internal和external。

1. Public意味任何人都可以调用公共函数。2. Private意味着只能从契约内部调用函数。3. Internal允许从父合约继承的合约使用该函数。4. External 函数是合约接口的一部分,这意味着它们可以从其他合约和通过事务调用。

也就是说,除非需要进行外部交互,否则请将函数设为Private或Internal。此外我们的getCoinCount函数具有“ view”关键字,该关键字是可选的,但指定我们不更改此函数内的任何存储变量。我们仅“查看”某些数据,例如我们的硬币。

为了跟踪收集了多少硬币,我们添加了映射coinCount。游戏开始时,将重置玩家的值,并且在玩游戏时,每个硬币收集将使该值增加1。我们的映射将获取一个地址(当前玩家)并将其“指向”该值,即所收集硬币的计数。因此,我们能够在coinCount中保存每个玩家的当前状态。

让我们添加最后的代码段:Events。Events对我们的客户而言最重要。它使我们能够注意到发生了什么。例如我们想知道玩家何时开始并赢得比赛或何时收集硬币。

pragmasolidity>=0.5.0<0.6.0;contractCoinCollector{uint256privatewinCondition;mapping(address=>uint256)privatecoinCount;eventonStartGame(address_player);eventonCoinCollected(address_player,uint256_coinCount);eventonEndGame(address_player);constructor(uint256_winCondition)public{winCondition=_winCondition;}functionstartGame()external{coinCount[msg.sender]=0;emitonStartGame(msg.sender);}functioncollectCoin()external{coinCount[msg.sender]+=1;emitonCoinCollected(msg.sender,coinCount[msg.sender]);if(coinCount[msg.sender]==winCondition){emitonEndGame(msg.sender);}}functiongetCoinCount()externalviewreturns(uint256){returncoinCount[msg.sender];}}请注意,我们在存储变量所在的顶部添加了可能的事件。每个事件定义了所需的信息。在collectCoin函数中,我们添加了一个if语句,以始终检查仅收集硬币的玩家是否满足获胜条件。如果是这样,将发出结束游戏事件,并且客户端会注意到该事件。每次我们在代码中引用“ msg.sender”时,它都指向传入交易的地址,即播放器。

智能合约基本完成。随意玩耍并添加其他功能,例如可以收集的全部硬币,收集不同的硬币类型,或者集成机制以使其成为多人游戏。是时候发挥你的创造力!

部署智能合约

首先,我们需要使用以下命令安装Loom SDK:

curlhttps://raw.githubusercontent.com/loomnetwork/loom-sdk-documentation/master/scripts/get_loom.sh|sh接下来,使用以下命令创建部署智能合约所需的私钥:
./loomgenkey-kpriv_key-apub_key现在,我们正在为智能合约创建一个二进制文件。
solc--bin--overwrite-o.CoinCollector.sol并使用此二进制文件将我们的智能合约部署到Loom Testnet(完全免费!)。我们指定私钥“-k”,二进制文件“-b”,链URL“-u”和链ID“-chain”。
./loomdeploy-kpriv_key-bCoinCollector.bin-uhttp://extdev-plasma-us1.dappchains.com:80--chain“extdev-plasma-us1”结果应如下所示,其中最上方是合约地址,后跟我们的bytecode。
Newcontractdeployedwithaddress:extdev-plasma-us1:0xfC4ce0E01e8fdd309af77564bF5bE8b7dE79E3e9Runtimebytecode:[9612896648252128219701687960128253918096454169709487960531241000000000000000000000000000014441289917112656160209709987128992028316172209701298712899214901812422097013987919601282539197010797014986919664811281301298296321145808096648112814531442439197013797022086910919701479721308691091960961960511152552552552552552552552552552552552552552552552552552552552552211525525525525525525525525525525525525525525525525525525525525522129829632114412982963219603284144801448691961128960511152552552552552552552552552552552552552552552552552552552552552211525525525525525525525525525525525525525525525525525525525525522129829632114412982963219603296013013084114680801291448580127191239136214251221496711098573822262243239224633523935206361914222312205423186875196196051115255255255255255255255255255255255255255255255255255255255255221152552552552552552552552552552552552552552552552552552552552552212982963211441298296321960328496648112813111525525525525525525525525525525525525525525525525525525525525522115255255255255255255255255255255255255255255255255255255255255221298296321130129829632114680808096648112814531441619608496196051115255255255255255255255255255255255255255255255255255255255255221152552552552552552552552552552552552552552552552552552552552552212982963211441298296321960328420219721288712724114645227151135446721720818516516716456126821381678623425112248149774217719715012319351966481128130115255255255255255255255255255255255255255255255255255255255255221152552552552552552552552552552552552552552552552552552552552552212982963211458080966481128145314416191869196096196051115255255255255255255255255255255255255255255255255255255255255221152552552552552552552552552552552552552552552552552552552552552212982963211441298296321960321291448580127164241681291181212862001902421221035014312112172320915538140190174131119908123923696519664811281301152552552552552552552552552552552552552552552552552552552552552211525525525525525525525525525525525525525525525525525525525525522129829632114580809664811281453144161862541611019812212211448883237591251480361762482209418810121719420622290411625120710425240651941557020825411797041]Transactionreceipt:e9810a90a1cecebce9c5d2b19f152ea52029d574f9ae1cd08cce30d4b3af65f4请注意,已部署的智能合约地址为“ 0xfC4ce0E01e8fdd309af77564bF5bE8b7dE79E3e9”。 现在您可以在Loom Block Explorer中找到它。需要将智能合约地址添加到您的游戏客户端。

非常好!智能合约已经开发完善,去在Unity中创建迷你游戏吧,立即使用您的智能合约!

猜你喜欢

从零开发区块链应用(一)-golang配置文件管理工具viper

理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response

2022-01-20

从零开发区块链应用(二)--mysql安装及数据库表的安装创建

varchar 类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取 0~~65525 之间的任意值。指定了 varchar 类型的最大值以后,其长度可以在 o 到最大长度之间。

2022-01-20

从零开发区块链应用(三)--mysql初始化及gorm框架使用

Gorm 是 golang 的一个 orm 框架,它提供了对数据库操作的封装,使用起来相当便利。所以如果对 mysql 使用操作不熟悉,建议也可以使用 gorm 框架操作 mysql 数据库。

2022-01-20

从零开发区块链应用(四)--自定义业务错误信息

在实际业务开发中,一个条错误信息需要包含两部分内容:直接展示给用户的 message 和用于开发人员 debug 的 error 。message 可能会直接展示给用户,error 是用于 debug 的错误信息,可能包含敏感/内部信息,不宜对外展示

2022-01-20

从零开发区块链应用(五)--golang网络请求

理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response。

2022-01-20