以太坊智能合约的生命周期

最近在写一个募资合约时,发现自己对合约的生命周期还不是很了解,该用一个合约管理所有发起的募资,还是一个募资发起一个合约呢?因此查询了官网跟几文章,然后在testnet上测试了一下。

以物件导向来比喻

以物件导向来比喻的话,可以把一个contract 想像成一个class,contract 可以被多次部署在网路上,每个实体都会有不同的地址,这个地址以后可以用来和这个地址指定的合约实体交互。因此每个部署的合约可以想成是物件导向的物件实体,每个合约实体都有自己的状态(内部永久性的资料)。

合约的建构函数在合约部署到网路上时被呼叫,这也是唯一次被呼叫。所以,所有的初始化都应该在建构函数里,在部署时只被执行一次。
在建立完合约之后,会有一个合约地址可以使用,在合约的有效期限之内可以用来和这个合约实体交互。

可以在合约内透过调用一个包括selfdestruct 的函数来销毁合约,这个函数就类似于物件导向里面解构函数destructor 的概念。

多合约

如果你的方案需要一个以上的合约来执行任务,就必需独立地部署每个合约。A合约跟B合约沟通的唯一方法就是知道B合约的地址。

如果A合约需要跟不同的B合约实体进行交互,在调用相关函数时必须传入B合约实体的地址。如果A合约只跟一个B合约实体通讯,直接在A合约建构函数里传入B合约的实体地址,让A合约存为变数即可。

讯息传送者的地址

如果A合约里的A函数, 调用B合约里的B函数,在B函数的环境里msg.sender 就是A合约的地址,如果你想在B函数里面确定交易的发起者,应该使用tx.origin。如果你从A函数里调用同样是A合约的A1函数, msg.sender 就是发起交易的地址跟tx.origin 一样。

结论

对于我现在这个募资项目来说,一个合约实体等同于一个独立的募资,显然比较合理。然后再用其他方式来管理这些合约实体,比如说一个管理类别的合约。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。