美文网首页以太坊- Ethereum
以太坊开发(十)Mist使用:调用合约

以太坊开发(十)Mist使用:调用合约

作者: yuyangray | 来源:发表于2018-03-04 09:57 被阅读492次

    这篇文章来自以太中文网:区块链学堂(18):Mist 4–代币Token合约详解,我会对使用过程中自己遇到的问题进行补充。

    pragma solidity 0.4.20;
    contract Token {
      mapping (address => uint) public balancesOf;
      address public owner;
      function Token() public {
        owner = msg.sender;
        balancesOf[msg.sender] = 10000;
      }
    
      function transfer (address _to, uint _value) public {
        require (balancesOf[msg.sender] > _value);  //避免转移出去的代币超过当前的存货
        require (balancesOf[_to] + _value > balancesOf[_to]);  //避免自己调用自己,或者递归调用
        balancesOf[msg.sender] -= _value;
        balancesOf[_to] += _value;
      }
    
      function mint(uint _amount) public {
        balancesOf[owner] += _amount;
      }
    }
    
    • 从上面的代码中我们可以看到,总共有两个属性balancesOfowner
    • 另外还有两个方法mint()transfer()

    智能合约的属性balancesOf & owner

    我们在合约界面点开Token合约。

    • 可以看到左侧是该合约两个属性balancesOf & owner

    • 构造函数中写了代码owner=msg.sender,因此谁创建合约,owner这个变量就是msg.sender。此处owner=account1也就是account 1创建了本合约。

    • balancesOf[msg.sender] = 10000; 所以owner在数组balancesOf中的值就是10000。

    • 同理的balancesOf[Main Account]就应该为0,我们从geth中可以轻松得到eth.accounts[0]& eth.accounts[1]的地址。

    > eth.accounts
    ["0x48ad44beba68a981e103d28b2bd5777ef21ba0e3", "0x66f44c178a2337e40355bd4b5442229cda24f803"]
    

    然后查看变量balancesOf["0x48ad44beba68a981e103d28b2bd5777ef21ba0e3"]如图所示:

    智能合约的方法 mint()

    方法 mint()中的代码是 balancesOf[owner] += _amount;, 因此无论输入多少,增加值都只会增加到balancesOf[owner]的数据上去。

    我们选择右侧的方法Mint, 设置amount = 1000, 如下图所示

    点击Execute按钮, 如下图所示

    • 带锁icon的是以太坊普通账户,而带合约的是智能合约账户。之前说过智能合约也是一个特殊的账户。

    • 同样执行任何transaction都需要gas,谁执行谁承担gas,在上面选择中,我们选择了main account那么相应的gas就由main account承担。

    • raw data: 是代表传递给该合约的具体数据,这个里面的包含了一个短地址, 代表执行function mint(),还有一个传递的数据1000,也就是16进制0x3e8。

    • 输入密码后,点击send transaction,然后等待一段挖矿的时间之后,结果如下图所示, 可以看到balancesOf[owner] 增加了1000。

    (注:所有的交易都需要在Geth挖矿,等待所有区块确认。)

    智能合约的方法 transfer()

    方法transfer() 中的核心代码是

    balancesOf[msg.sender] -= _value;
    balancesOf[_to] += _value;
    

    也就是说msg.sender的账户会减少一定数额,而_to会增加一定数额
    因此我们调用transfer方法,并设置如下

    点击execute后,输入账号密码,执行该方法transfer()

    执行的结果如下:
    balancesOf[account1]=10700,
    balancesOf[main account]=300

    如下图所示:

    (注:可以看到这两个账户的金额,在钱包中并没有变化,变化的是在该合约中的余额。)

    参考:区块链学堂(18):Mist 4–代币Token合约详解
    作者:以太中文网

    相关文章

      网友评论

        本文标题:以太坊开发(十)Mist使用:调用合约

        本文链接:https://www.haomeiwen.com/subject/uvntfftx.html