《智能合约开发课》学习3:合约解读

in #cn7 years ago (edited)

img最近报名参加了硅谷区块链举办的《智能合约开发课》第二期培训班,根据培训要求,不能完全透露课程的内容,但我会在steemit上记录我的成长过程。

课程还没有正式开始,我先多多预习一些相关内容,有些不太系统。今天学习这篇菜鸟课程中的内容

这篇教程中给出了一个针对会议Conference的智能合约,通过这份合约参会者可以买票,组织者可以设置参会人数上限以及退款策略等,源代码在这个代码仓库中可以找到,是基于Truffle2.0.4版本的,而我现在用的Truffle已经是4.0.4版本了,看来内容有点老,先学学看。

contract Conference {
  address public organizer;
  mapping (address => uint) public registrantsPaid;
  uint public numRegistrants;
  uint public quota;

  event Deposit(address _from, uint _amount);  // so you can log these events
  event Refund(address _to, uint _amount); 

  function Conference() { // Constructor
    organizer = msg.sender;
    quota = 500;
    numRegistrants = 0;
  }
  
  function buyTicket() public returns (bool success) {
    if (numRegistrants >= quota) { return false; }
    registrantsPaid[msg.sender] = msg.value;
    numRegistrants++;
    Deposit(msg.sender, msg.value);
    return true;
  }
  
  function changeQuota(uint newquota) public {
    if (msg.sender != organizer) { return; }
    quota = newquota;
  }
  
  function refundTicket(address recipient, uint amount) public {
    if (msg.sender != organizer) { return; }
    if (registrantsPaid[recipient] == amount) { 
      address myAddress = this;  //this指合约地址
      if (myAddress.balance >= amount) { 
        recipient.send(amount);
        registrantsPaid[recipient] = 0;
        numRegistrants--;
        Refund(recipient, amount);
      }
    }
  }
  
  function destroy() { // so funds not locked in contract forever
    if (msg.sender == organizer) { 
      suicide(organizer); // send funds to organizer
    }
  }
}

contract

合约的名字就是Conference

地址类型

address public organizer;

address是关键字,代表地址类型,这种类型是所有其它语言没有的。本例中存储了会议主办方的钱包地址,organizer这个变量在后面的构造函数中被赋值。

mapping

mapping不太容易理解,先理解为哈希表,需要在后面多接触一些例子去体会。

合约地址

与刚才看到的organizer不同,当一个合约部署之后,就会有一个合约地址,可以用this来访问这个合约地址。

destroy()函数

最后一个函数destroy()没看懂,原文中这样写到:

转给合约的资金会保存于合约(地址)中。最终这些资金通过destroy函数被释放给了构造函数中设置的组织者地址。这是通过suicide(orgnizer);这行代码实现的。没有这个,资金可能被永远锁定在合约之中(reddit上有些人就遇到过),因此如果你的合约会接受资金一定要记得在合约中使用这个方法!

上面的汉字都认得,但意思没理解。

测试代码

看上面的代码仍有许多的不理解,必须配合测试代码来一起研究,可惜最简单的这一段测试代码也没搞懂,还得再补补Javascript的知识。

contract('Conference', function(accounts) {
  it("should assert true", function(done) {
    var conference = Conference.at(Conference.deployed_address);
    assert.isTrue(true);
    done();   // stops tests at this point
  });
});

学到这里,后面的测试用例已经读不懂了,看来这篇教程还不太适合我,得换教程继续研究。


本文由币乎(bihu.com)内容支持计划奖励

2017年年底前与 @yellowbird 共同发起了一项2017年终总结抽奖活动,参与链接:https://steemit.com/cn/@yellowbird/steemit-2017 ,欢迎大家踊跃参加。

下一篇

Sort:  

follow me and upvote me please

技术性太强!有点头晕!