900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 以太坊知识教程------智能合约(2)调用

以太坊知识教程------智能合约(2)调用

时间:2020-12-30 03:33:58

相关推荐

以太坊知识教程------智能合约(2)调用

1. 合约消息

合约之间通过调用或发送消息的方式进行交互 。当一个合约接收到一条消息时,它可以回复一些数据,这样消息的原发送者就能立即使用 。采用这种方法,发送一条消息就像调用一次函数。

一个智能合约能够给其他智能合约发送消息( Messages ) 。消息是永远不会序列化的虚拟对象 ,仅存于以太坊执行环境,可以认为就是函数调用。合约可以通过消息调用的方式来调用其他合约 ,或者发送以太币到非合约账户 。消息除了是由合约产生而不是外部账户产生外 ,基本等同交易。消息触发接收合约账户运行其代码 。 因此,合约之间的关系与外部账户之间的关系基本类同。当一个正在执行的合约执行call或者delegatecall操作命令时,就产生一条消息。

一个消息包含如下内容。

( 1 )消息的发送者(隐含) 。

( 2 )消息的接收者。

( 3) Value域 : 向智能合约地址转账的数量(单位为wei ) 。

( 4 )可选数据域 : 给智能合约的实际输入参数。

( 5 ) Startgas值 : 消息触发代码执行所产生的最大燃料值。

( 6 ) 返回数据

“事实上每笔交易都可以被认为是一个顶层的消息调用,这个消息调用会依次产生更多 的消息调用 。”

2. 调用原理

2.1 触发条件

1). 默认条件下 ,以太坊执行环境是无状态的 。如没有外部触发 ,以太坊网络的状态不会发生变化 ,所有账户状态都是一样的 。

2). 任何用户通过外部账户发送一个交易将触发一个动作 ,从而使以太坊处于活动状态。

3). 如果交易的目标是另外一个EOA外部用户账户 ,交易除了 “虚拟币 ” 互换外也不能做其他任何事情。 如果交易的目标是一个智能合约,合约一旦被触发 ,它就可以自动运行合约代码 。

2.2 调用原理

1). 当合约调用时,虚拟机为被调用的合约创建一块全新的内存区域,以及能够访问调用的Payload (由被称为“ calldata " 的独立区域所提供的数据)。

2). 当调用执行结束后,返回数据将被存储在调用者预先分配好的一块内存中 。调用层数被限制为 1024 ,因此对于更加复杂的操作,我们应该使用循环而不是递归 。

3). 合约代码能够读、写其自身的内部存储(一个匹配32字节密钥与32字节数值的数据库),读出所接收消息的存储数据,向另一个合约发送消息,反过来触发其执行。 账户存储则是与合约账户绑定的持久化存储,在合约 B 的代码执行过程中,可以对 B 的账户存储进行读写操作。

4).一旦合约执行停止 , 由合约停止发出的消息触发的所有子代码也将停止(在一个确定性同步顺序环境中,父函数下一步操作执行之前 , 所有调用的子函数必须先执行完成),执行环境中止, 直到由下一次交易唤醒。

一个合约可以决定剩余 gas 的分配 。比如在内部消息调用时使用多少 gas,或者期望保留 多少 gas 。 如果在内部消息调用时发生了费用不足( out-of-gas )异常(或者其他异常),合约将会得到通知(异常会“冒泡”到合约的调用核)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。