}
uint location = uint(keccak256(“queue.data.location”));
assembly { qds.slot := location }
switch result
function consume() public returns (uint total) {
提供了produce()和consume()民众函数来执行此办理方案的实际操纵。方针函数必需具有与Router协定中的民众函数沟通的成果签名(name和parameters),因为利用动静中提供的成果签名来挪用库。
智能合约/库的代码和数据位置
(bool success, uint item) = QueueDataLib.remove(qds);
constructor() {
在这种环境下,路由必需是Solidity智能合约,因为它为来自其自身和从属库的所有数据提供存储空间打点。
耗气量
典范智能合约用法
消费者合约与出产者库很是相似,包括在路由合约的情况中从民众行列数据中删除项目以及哄骗其本身的私有数据的代码。
let result := delegatecall(gas(), adrs, 0,
uint count;
return abi.decode(bm, (uint256));
The Consumer Data – within the Router contract
assembly { pds.slot := location }
Solidity v0.6.4及更高版本支持此要领。
The QueueData – within the Router contract
router = new Router(queueSize);
对付本文,我们假设我们正在构建一个与“共享民众数据的智能合约”相匹配的办理方案,也就是说,路由应包括一个出产者,该出产者发生一些列队给消费者利用的工具。在这篇文章中,我们并不真正体贴隶属库的实际成果和利用。重点先容数据共享的常用要领。 uint location = uint(keccak256(“queue.data.location”));
}
}
}
uint queueSize = 2;
constructor(uint32 queueSize) {
(QueueData storage qds) {
constructor(uint32 qSize) {
这些函数也可以按照开拓人员的需要举办扩展或内联。不幸的是,必需在此库中提供queueData()函数,而且必需将沟通的代码复制到利用者库中,因为Solidity库不行能从民众基本合约或库担任。
struct ProducerData {
正如预期的那样,这些项目标本钱概略上是相似的。
QueueDataLib.create(Producer.queueData(), qSize);
calldatasize(), 0, 0)
在此示例中,出产者和消费者是Solidity库。它们的成果将始终在路由的情况中执行。
function queueData() internal pure returns
if (ok) {
本文接头了Solidity智能合约利用库共享民众数据。
智能合约陈设
function queueData() internal pure returns
这个简朴、交互式、智能合约陈设人员可以或许挪用出产和消费者。
function produce() public {
}
还结构了另一个智能合约,该智能合约包罗担任的出产者和消费者合约,以利便举办气体耗损量较量。从属合约利用沟通的分派存储要领。
}
}
function produce() public {
(ProducerData storage pds) {
出产者库和利用者库中都可以利用出产者利用的queueData()函数。
QueueData storage qds = queueData();
case 0 {revert(0, returndatasize())}
假如只有一个从属合约或库,则凭据“编码可进级的智能合约”一文,可以利用路由合约的回退函数。可是在此示例中,由于方针函数位于差异的从属库中,因此无法利用路由合约的回退函数。
如“共享民众数据的智能合约”中所述,路由合约的produce()和consume()民众函数利用callLib()来挪用从属的Producer和Consumer库函数:
(bool ok, bytes memory bm) = callLib(address(Consumer));
The Router Data – within the Router contract
Producer.produce();
producerData()函数提供对出产者数据的引用,该引用仅由该库利用。
智能合约大概被分成多个组件,这些组件需要共享民众数据并将私有数据定位在安详的处所,原因有许多。
library Consumer {
然而用于在Solidity智能合约之间共享民众数据的技能也合用于Solidity库。本文描写了如何实现这一点,并较量了智能合约和库办理方案的耗气量。
The Router contract
}
(QueueData storage qds) {
The QueueDataLocation contract
function consume() public returns (uint count) {
}
QueueData storage qds = queueData();
return Consumer.consume();
QueueDataLib.create(Producer.queueData(), queueSize);
}
发起利用该文章中先容的“存储私有合约数据的存储要领”来分派路由数据,以低落假如将任何从属智能合约添加到路由时包围存储的风险。此要领合用于库以及智能合约。
在我们的文章“利用智能合约共享民众数据”中,我们描写了为什么以及如何靠得住地利用智能合约共享民众数据。
ConsumerData()函数提供对消费者数据的引用,该数据仅由该库利用。
function producerData() internal pure returns
同样queueData()函数提供对行列数据的引用,这将与路由合约和利用者库一起利用。确定命据位置的算法[在这种环境下为keccak256(“ queue.data.location”)]必需与Producer库中利用的算法沟通,以便定位沟通的数据。
}
行列数据和库
Router router;
The Consumer library
function produce() public {
default {return (0, returndatasize())}
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。