如何在Loom的BaseChain创建和部署智能合约

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

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

1. 1-3秒确认时间。


2. 用户无需支付气体费。


3. 避免主网交易拥塞。


4. 与MetaMask和其他主要以太坊钱包完全兼容。

创建智能合约



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

如何在Loom的BaseChain创建和部署智能合约

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

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

pragma solidity >=0.5.0 <0.6.0;

/// @author Julian Sakowski
/// @title A prototype game contract
contract CoinCollector {
    /// @dev The amount of coins required to win the game.
    uint256 private winCondition;

    /// @dev Maps the subscriber index to an address.
    mapping (address => uint256) private coinCount;

    /** @dev Emits on game start.
      * @param _player The address of the player starting the game.
      */
    event onStartGame(address _player);
    /** @dev Emits on a coin being collected.
      * @param _player The address of the player collecting the coin.
      * @param _coinCount The current collected coin count of the player.
      */
    event onCoinCollected(address _player, uint256 _coinCount);
    /** @dev Emits on game end.
      * @param _player The address of the player ending the game.
      */
    event onEndGame(address _player);

    /** @notice Creates the smart contract and initializes the win condition.
      * @dev The constructor, which initializes the win condition.
      * @param _winCondition The amount of coins required to win a game.
      */
    constructor(uint256 _winCondition) public {
        winCondition = _winCondition;
    }

    /** @notice Any player can start a game for him or herself.
      * @dev Resets the coinCount for msg.sender.
      */
    function startGame() external {
        coinCount[msg.sender] = 0;
        emit onStartGame(msg.sender);
    }

    /** @notice Any player can collect coins.
      * @dev Increases the coin count for the msg.sender and checks for the valid win condition.
      */
    function collectCoin() external {
        coinCount[msg.sender] += 1;
        emit onCoinCollected(msg.sender, coinCount[msg.sender]);

        if (coinCount[msg.sender] == winCondition){
            emit onEndGame(msg.sender);
        }
    }

    /** @notice Shows the count of collected coins for the active player.
      * @dev Returns the coin count collected by the msg.sender.
      * @return The count of collected coins.
      */
    function getCoinCount() external view returns (uint256) {
        return coinCount[msg.sender];
    }
}

一步一步来

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

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

pragma solidity >=0.5.0 <0.6.0;
contract CoinCollector {
}

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

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

pragma solidity >=0.5.0 <0.6.0;
contract CoinCollector {
    uint256 private winCondition;

    constructor(uint256 _winCondition) public {
        winCondition = _winCondition;
    }
}

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

我们的功能:

pragma solidity >=0.5.0 <0.6.0;
contract CoinCollector {
    uint256 private winCondition;
    mapping (address => uint256) private coinCount;

    constructor(uint256 _winCondition) public {
        winCondition = _winCondition;
    }
    function startGame() external {
        coinCount[msg.sender] = 0;
    }
    function collectCoin() external {
        coinCount[msg.sender] += 1;
    }
    function getCoinCount() external view returns (uint256) {
        return coinCount[msg.sender];
    }
}

注意,除了构造函数,我们现在还创建了三个函数。我们希望能够开始游戏,收集硬币并始终接收有关已经收集了多少硬币的信息。我们为每个函数提供了可见性修饰符。可能的修饰符是public,private,internal和external。

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

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

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

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

pragma solidity >=0.5.0 <0.6.0;
contract CoinCollector {
    uint256 private winCondition;
    mapping (address => uint256) private coinCount;
    event onStartGame(address _player);
    event onCoinCollected(address _player, uint256 _coinCount);
    event onEndGame(address _player);

    constructor(uint256 _winCondition) public {
        winCondition = _winCondition;
    }
    function startGame() external {
        coinCount[msg.sender] = 0;
        emit onStartGame(msg.sender);
    }
    function collectCoin() external {
        coinCount[msg.sender] += 1;
        emit onCoinCollected(msg.sender, coinCount[msg.sender]);

        if (coinCount[msg.sender] == winCondition){
            emit onEndGame(msg.sender);
        }    
    }
    function getCoinCount() external view returns (uint256) {
        return coinCount[msg.sender];
    }
}

请注意,我们在存储变量所在的顶部添加了可能的事件。每个事件定义了所需的信息。在collectCoin函数中,我们添加了一个if语句,以始终检查仅收集硬币的玩家是否满足获胜条件。如果是这样,将发出结束游戏事件,并且客户端会注意到该事件。每次我们在代码中引用“ msg.sender”时,它都指向传入交易的地址,即播放器。

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

部署智能合约

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

curl https://raw.githubusercontent.com/loomnetwork/loom-sdk-documentation/master/scripts/get_loom.sh | sh

接下来,使用以下命令创建部署智能合约所需的私钥:

./loom genkey -k priv_key -a pub_key

现在,我们正在为智能合约创建一个二进制文件。

solc –bin –overwrite -o . CoinCollector.sol

并使用此二进制文件将我们的智能合约部署到Loom Testnet(完全免费!)。我们指定私钥“-k”,二进制文件“-b”,链URL“-u”和链ID“-chain”。

./loom deploy -k priv_key -b CoinCollector.bin -u 
http://extdev-plasma-us1.dappchains.com:80 –chain “extdev-plasma-us1”

结果应如下所示,其中最上方是合约地址,后跟我们的bytecode。

New contract deployed with address: extdev-plasma-us1:
0xfC4ce0E01e8fdd309af77564bF5bE8b7dE79E3e9
Runtime bytecode: [96 128 96 64 82 52 128 21 97 0 16 87 96 0 128 253 91 
80 96 4 54 16 97 0 94 87 96 0 53 124 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 144 4 128 99 171 126 56 160 20 97 0 99 87 128 
99 202 83 16 172 20 97 0 129 87 128 99 214 90 181 242 20 97 0 139 87 91 
96 0 128 253 91 97 0 107 97 0 149 86 91 96 64 81 128 130 129 82 96 32 1 
145 80 80 96 64 81 128 145 3 144 243 91 97 0 137 97 0 220 86 91 0 91 97 
0 147 97 2 130 86 91 0 91 96 0 96 1 96 0 51 115 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 22 115 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
22 129 82 96 32 1 144 129 82 96 32 1 96 0 32 84 144 80 144 86 91 96 1 
128 96 0 51 115 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 22 115 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 22 129 82 96 32 1 144 129 82 96 
32 1 96 0 32 96 0 130 130 84 1 146 80 80 129 144 85 80 127 191 239 136 
214 251 22 149 67 110 98 57 38 222 62 243 239 224 63 35 239 35 206 36 
19 14 22 231 220 54 231 86 87 51 96 1 96 0 51 115 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 22 115 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 22 129 82 96 32 1 144 129 82 96 32 1 96 0 32 84 96 64 81 128 131 115
 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 255 255 22 115 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 255 255 255 255 255 255 22 129 82 96 32 1 130 129 82 96 32 1 146 80 80
 80 96 64 81 128 145 3 144 161 96 0 84 96 1 96 0 51 115 255 255 255 255
 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 22 115 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 255 255 22 129 82 96 32 1 144 129 82 96 32 1 96 0 32 84 20 21 97 2 128
 87 127 241 146 45 227 151 135 44 67 217 208 185 165 167 164 56 126 82 
138 167 86 234 251 122 48 149 77 42 177 197 150 123 193 51 96 64 81 128 
130 115 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 22 115 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 22 129 82 96 32 1 145 80 80 96 64 81 128
 145 3 144 161 91 86 91 96 0 96 1 96 0 51 115 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 22 115 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 22 129 82 96 32 1 144 129 82 96 32 1 96 0 32 129 144 85 80 127 164 24 
168 129 11 81 212 86 200 190 242 122 103 50 143 121 1 217 23 209 155 38
 140 190 174 131 119 90 81 239 236 96 51 96 64 81 128 130 115 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 22 115 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 22 129 82 96 32 1 145 80 80 96 64 81 128 145 3 144 161 
86 254 161 101 98 122 122 114 48 88 32 37 59 125 14 80 36 176 248 220 
94 188 101 217 194 206 222 90 41 16 251 207 104 252 40 65 194 155 70 
208 254 117 97 0 41]
Transaction receipt: e9810a90a1cecebce9c5d2b19f152ea52029d574f9ae1cd08c
ce30d4b3af65f4

请注意,已部署的智能合约地址为“ 0xfC4ce0E01e8fdd309af77564bF5bE8b7dE79E3e9”。 现在您可以在Loom Block Explorer中找到它。需要将智能合约地址添加到您的游戏客户端。

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

关键词: Loom  BaseChain  智能合约  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28302

联系我们

aliyinhang@gmail.com