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

in cn •  7 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 ,欢迎大家踊跃参加。

下一篇

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

follow me and upvote me please

技术性太强!有点头晕!