最近在写一个募资合约时,发现自己对合约的生命周期还不是很了解,该用一个合约管理所有发起的募资,还是一个募资发起一个合约呢?因此查询了官网跟几文章,然后在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 一样。
结论
对于我现在这个募资项目来说,一个合约实体等同于一个独立的募资,显然比较合理。然后再用其他方式来管理这些合约实体,比如说一个管理类别的合约。