首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eris工业教程:从其他合同调用合同对象

Eris工业教程:从其他合同调用合同对象
EN

Ethereum用户
提问于 2016-07-14 20:01:43
回答 1查看 296关注 0票数 2

厄里斯工业教程中,他们提出了一个银行和基金管理合同制度。

FundManager控制bank合同。我不明白用于检查函数调用是否成功的deposit函数的下面一行:

代码语言:javascript
复制
bool success = Bank(bank).deposit.value(msg.value)(msg.sender);

为什么是Bank(bank)?它是什么?FundManager有一个address bank属性,由构造函数实例化。

所以,基本上,我的问题是:

代码语言:javascript
复制
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?
EN

回答 1

Ethereum用户

回答已采纳

发布于 2016-07-14 20:39:09

FundManager构造函数创建一个新的Bank契约对象.

代码语言:javascript
复制
bank = new Bank();

...and将其地址存储在以下变量中:

代码语言:javascript
复制
// This holds a reference to the current bank contract.
    address bank;

当调用FundManager's deposit函数时,它使用其地址调用Bank契约,如前一个线程中所解释的那样:

代码语言:javascript
复制
Bank(bank)...

全面的呼吁是:

代码语言:javascript
复制
bool success = Bank(bank).deposit.value(msg.value)(msg.sender);

其中,deposit合同中的Bank函数定义为:

代码语言:javascript
复制
// 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,因此我们期望第一个合同中的调用是:

代码语言:javascript
复制
Bank(bank).deposit(msg.sender)

...where msg.sender等同于address customer。到目前为止很清楚。

但是,对于外部函数调用,如果我们希望第二个契约知道第一个契约中msg.value的原始值,那么我们必须显式地传递它。原因是(来自Solidity中的页面(部分向下)):

msg的所有成员的值,包括msg.sender和msg.value,都可以对每个外部函数调用进行更改。这包括对库函数的调用。

为了显式地传递值,我们还需要一个value(msg.value),按照惯例,这个值在我们调用的函数的实际参数之前:

代码语言:javascript
复制
          +------------------------------------+
          |                                    |
          |                                    V
Bank(bank).deposit    .value(msg.value)      (msg.sender)
                            ^
                            |
                  shove it in the middle
票数 4
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/7101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档