在厄里斯工业教程中,他们提出了一个银行和基金管理合同制度。
FundManager控制bank合同。我不明白用于检查函数调用是否成功的deposit函数的下面一行:
bool success = Bank(bank).deposit.value(msg.value)(msg.sender);为什么是Bank(bank)?它是什么?FundManager有一个address bank属性,由构造函数实例化。
所以,基本上,我的问题是:
Bank(bank): Get a reference object of type `Bank` at address `bank`
Bank(bank).deposit: call the `deposit` function on that object
Bank(bank).deposit.value(msg.value): What is happening here and what is returned?
Bank(bank).deposit.value(msg.value)(msg.sender): What is happening here?发布于 2016-07-14 20:39:09
FundManager构造函数创建一个新的Bank契约对象.
bank = new Bank();...and将其地址存储在以下变量中:
// This holds a reference to the current bank contract.
address bank;当调用FundManager's deposit函数时,它使用其地址调用Bank契约,如这前一个线程中所解释的那样:
Bank(bank)...全面的呼吁是:
bool success = Bank(bank).deposit.value(msg.value)(msg.sender);其中,deposit合同中的Bank函数定义为:
// This will take the value of the transaction and add to the senders account.
function deposit(address customer) returns (bool res)customer地址参数等于FundManager中调用传递的msg.sender。
银行(银行).deposit.value(msg.value):这里发生了什么,返回了什么?
我不认为这是一个有效的电话本身。它可能会抱怨一场漏掉的争论。
Bank(bank).deposit.value(msg.value)(msg.sender):这里发生了什么事?
Bank(bank).deposit()是一个外部函数调用:它在另一个契约中调用一个函数。
第二个合同中的deposit函数的参数是address customer,因此我们期望第一个合同中的调用是:
Bank(bank).deposit(msg.sender)...where msg.sender等同于address customer。到目前为止很清楚。
但是,对于外部函数调用,如果我们希望第二个契约知道第一个契约中msg.value的原始值,那么我们必须显式地传递它。原因是(来自Solidity中的这页面(部分向下)):
msg的所有成员的值,包括msg.sender和msg.value,都可以对每个外部函数调用进行更改。这包括对库函数的调用。
为了显式地传递值,我们还需要一个value(msg.value),按照惯例,这个值在我们调用的函数的实际参数之前:
+------------------------------------+
| |
| V
Bank(bank).deposit .value(msg.value) (msg.sender)
^
|
shove it in the middlehttps://ethereum.stackexchange.com/questions/7101
复制相似问题