区块链技术DAPP系统开发介绍

简介: 区块链技术DAPP系统开发介绍

孔乙己懂“回”字的四种写法,你会智能合约的四种调用方式吗?
在中大型的项目中,我们不可能在一个智能合约中实现所有的功能,而且这样也不利于分工合作。一般情况下,我们会把代码按功能划分到不同的库或者合约中,然后提供接口互相调用。

在Solidity中,如果只是为了代码复用,我们会把公共代码抽出来,部署到一个library中,后面就可以像调用C库、Java库一样使用了。但是library中不允许定义任何storage类型的变量,这就意味着library不能修改合约的状态。如果需要修改合约状态,我们需要部署一个新的合约,这就涉及到合约调用合约的情况。

合约调用合约有下面4种方式:

CALL
CALLCODE
DELEGATECALL
STATICCALL
1 CALL 和 CALLCODE
CALL和CALLCODE的区别在于:代码执行的上下文环境不同。

具体来说,CALL修改的是被调用者的storage,而CALLCODE修改的是调用者的storage。
在这里插入图片描述

我们写个合约验证一下我们的理解:

pragma solidity ^0.4.25;

contract A {

int public x;


function inc_call(address _contractAddress) public {
    _contractAddress.call(bytes4(keccak256("inc()")));
}
function inc_callcode(address _contractAddress) public {
    _contractAddress.callcode(bytes4(keccak256("inc()")));
}

}

contract B {

int public x;


function inc() public {
    x++;
}

}
我们先调用一下inc_call(),然后查询合约A和B中x的值有什么变化:
在这里插入图片描述

可以发现,合约B中的x被修改了,而合约A中的x还等于0。

我们再调用一下inc_callcode()试试:
在这里插入图片描述

可以发现,这次修改的是合约A中x,合约B中的x保持不变。

2 CALLCODE 和 DELEGATECALL
实际上,可以认为DELEGATECALL是CALLCODE的一个bugfix版本,官方已经不建议使用CALLCODE了。

CALLCODE和DELEGATECALL的区别在于:msg.sender不同。

具体来说,DELEGATECALL会一直使用原始调用者的地址,而CALLCODE不会。
在这里插入图片描述

我们还是写一段代码来验证我们的理解:

pragma solidity ^0.4.25;

contract A {

int public x;


function inc_callcode(address _contractAddress) public {
    _contractAddress.callcode(bytes4(keccak256("inc()")));
}
function inc_delegatecall(address _contractAddress) public {
    _contractAddress.delegatecall(bytes4(keccak256("inc()")));
}

}

contract B {

int public x;


event senderAddr(address);
function inc() public {
    x++;
    emit senderAddr(msg.sender);
}

}

我们首先调用一下inc_callcode(),观察一下log输出:

在这里插入图片描述

可以发现,msg.sender指向合约A的地址,而非交易发起者的地址。

我们再调用一下inc_delegatecall(),观察一下log输出:

在这里插入图片描述

可以发现,msg.sender指向的是交易的发起者。

3 STATICCALL
STATICCALL放在这里似乎有滥竽充数之嫌,因为目前Solidity中并没有一个low level API可以直接调用它,仅仅是计划将来在编译器层面把调用view和pure类型的函数编译成STATICCALL指令。

view类型的函数表明其不能修改状态变量,而pure类型的函数则更加严格,连读取状态变量都不允许。

目前是在编译阶段来检查这一点的,如果不符合规定则会出现编译错误。如果将来换成STATICCALL指令,就可以完全在运行时阶段来保证这一点了,你可能会看到一个执行失败的交易。

话不多说,我们就先看看STATICCALL的实现代码吧:

可以看到,解释器增加了一个readOnly属性,STATICCALL会把该属性置为true,如果出现状态变量的写操作,则会返回一个errWriteProtection错误。

就聊到这里,相信大家已经掌握了合约的四种调用方式了吧~

4 总结
总结一下:

call使用的是被调用者的上下文
callcode和delegatecall使用调用者的上下文
call可以涉及账户间的操作,另外两个可以理解为了放在以太坊上的类库,仅仅是调用他们的函数方法和storage。
callcode和delegatecall 的区别在于后者将calleradress和value始终指向原始调用的eoa外部账户,后者可能的最大用处就是可以在调用delegatecall的时候再调用call来对原始账户进行转账操作。

相关文章
|
17天前
|
存储 传感器 监控
未来智能城市中的区块链技术应用
随着城市化进程不断加速,智能城市成为了未来城市发展的主要趋势之一。区块链技术作为一种去中心化、安全可靠的数据传输和存储方式,将在智能城市建设中发挥关键作用。本文将探讨区块链技术在智能城市中的应用场景,并分析其对城市管理、信息共享和安全保障等方面的积极影响。
14 2
|
24天前
|
存储 供应链 区块链
区块链技术在供应链管理中的应用与展望
随着区块链技术的不断发展,其在供应链管理领域的应用愈发广泛。本文将深入探讨区块链技术在供应链管理中的具体应用及未来发展趋势,分析其对供应链透明度、可追溯性和安全性的影响,并展望区块链技术在未来供应链管理中的潜在作用和挑战。
17 0
|
26天前
|
存储 安全 物联网
未来技术纵横谈:区块链、物联网和虚拟现实的革新之路
在科技不断进步的今天,新兴技术正以前所未有的速度改变着我们的生活和工作方式。本文将深入探讨区块链、物联网(IoT)以及虚拟现实(VR)这三项技术的发展趋势与潜在应用场景,揭示它们如何塑造一个更加智能、互联和沉浸式的未来世界。通过对这些技术的综合分析,我们旨在提供一个全面的视角,以理解它们在未来社会结构中的重要性及影响。
23 7
|
27天前
|
供应链 安全 区块链
区块链技术在供应链管理中的应用与挑战
传统的供应链管理面临着信息不对称、数据共享困难等问题,而区块链技术的出现为供应链管理带来了新的解决方案。本文将介绍区块链技术在供应链管理中的应用情况,探讨其优势和挑战,并提出未来发展的方向。
39 2
|
27天前
|
存储 监控 安全
区块链技术机遇和挑战
区块链技术在数据安全和信息共享中发挥关键作用,提供去中心化、透明、安全和智能合约等优势,促进数据交易。然而,技术成熟度、数据效率、隐私保护、标准和监管以及用户接受度等挑战仍需克服,以构建安全、高效的数据共享环境。
29 1
|
27天前
|
存储 人工智能 供应链
区块链技术在供应链管理中的应用
传统的供应链管理系统存在着诸多问题,如信息不对称、数据可信度低等。区块链技术作为一种分布式账本技术,在供应链管理中具有独特优势。本文将探讨区块链技术在供应链管理中的应用,介绍其原理和优势,并分析实际案例以及未来发展趋势。
|
6天前
|
供应链 算法 安全
区块链技术的应用与前景展望
区块链技术的应用与前景展望
|
11天前
|
存储 供应链 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合革新
【4月更文挑战第7天】 在数字化浪潮推动下,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正不断重塑我们的工作、生活方式及商业模式。本文将深入探讨这些技术的发展趋势,以及它们如何相互交织,共同构建一个更加智能、互联和沉浸式的未来世界。区块链技术以其不可篡改的数据记录和去中心化特性,为安全性和透明度设立了新标准;物联网通过使设备智能化和网络化,推动了自动化和效率的飞跃;而虚拟现实则在娱乐、教育和医疗等领域开辟了前所未有的交互体验。文章还将剖析这些技术在实际应用中的案例,展示它们如何联合起来推动创新。
11 0
|
13天前
|
存储 安全 物联网
未来技术的融合与创新:区块链、物联网和虚拟现实的新趋势
【4月更文挑战第5天】 随着科技的不断发展,新兴技术如区块链、物联网和虚拟现实等正在逐渐改变我们的生活和工作方式。这些技术不仅在各自的领域取得了显著的进展,而且开始相互融合,为未来的应用提供了无限的可能性。本文将探讨这些新兴技术的发展趋势和应用场景,以及它们如何共同推动技术创新和社会进步。
|
16天前
|
供应链 安全 区块链
区块链技术在供应链管理中的应用与前景
传统的供应链管理存在着信息不对称、数据篡改等问题,而区块链技术的去中心化、不可篡改、可追溯等特点为解决这些问题提供了新的可能性。本文将探讨区块链技术在供应链管理中的应用现状及未来前景,分析其对供应链透明性、效率和安全性的提升,以及面临的挑战和发展趋势。
20 5