最近报名参加了硅谷区块链举办的《智能合约开发课》第二期培训班,根据培训要求,不能完全透露课程的内容,但我会在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 ,欢迎大家踊跃参加。
follow me and upvote me please
技术性太强!有点头晕!