Difference new() with depoly() of Solidity for Smart Contract

今天在做基于Ethereum的古董投资Dapp(编写完成后笔者会开源)单元测试时发觉了一个问题的存在,如题。我不确定new一个合约后返回的实例(一串十六进制的HASH)是否与deploy返回的HASH一样也是一个合约地址,在社区询问后无果,就自己在remix里写了一小段代码验证我的想法。希望能帮助读者解决这方面的困惑。

需要注意的是笔者在remix里的Environment是Injected Web3,使用MetaMask里的Kovan Test Network去完成测试。测试的Token可以在这里领取:https://gitter.im/kovan-testnet/faucet在gitter里发送你的钱包地址即可。下面进入正题:

图1

图1是我编写的一端简易的测试代码。我通过图右边的deploy直接将合约B部署上测试网络,在图左边的合约B代码中读者可以看见new了合约A的实例,那么我的猜想是否正确呢?我们将在测试网络的Ethereum区块链浏览器上看出结果。

图2

如图2,图左最上方的那条Transaction是我直接deploy后返回的结果(点进链接可查看详细内容,下面会详解)。图左下面三条是我new(点击图右下aInstance函数,详细代码看图1)实例后的结果。

图3

图3是点进deploy返回结果的链接显示的页面,图3下面的input Date是合约B的十六进制字节码,如图3所示创建红框里的合约并且返回其合约地址。对比图4、5、6,图4、5、6是new实例的详情。

图4

图5

图6

对比图3、4、5、6可以看出Transaction的对象(红框里的地址)都是同一串HASH,唯一不同的是图3是创建该合约,而其余三张是通过此合约再去创建另一合约(也就是创建新的合约地址)。所以图3没有图4、5、6最上面选项卡Internal Transaction。

图7

图8

图9

点进选项卡Internal Transaction,图7、8、9是new实例对象通过B合约创建的三个新的合约,图7、8、9红框中显示的是三个不同的合约地址。笔者点击图9红框中合约地址可见下图10的该合约的详情。

图10

图11

图10红框中的十六进制字节码与图11中合约A的字节码相同,点击进入图7、8的合约地址看到的字节码与图10、11的字节码也是相同的。即合约B每一次new都为创建合约A创建了新的合约地址,所以图1中Instance就是新的合约地址。与deploy效果一样返回的也是一个合约地址。

若笔者文中存在错误之处,欢迎各位读者指正,共同学习。