Chr*_*son 5 arrays blockchain ethereum solidity smartcontracts
当我尝试在 Solidity 中执行此操作时,它给了我 UnimplementedFeatureError: 嵌套动态数组未在此处实现。
我在代码示例中看到了这一点。Solidity不支持这个吗?
编辑 - 下面发布了完整的代码。所以我发现问题只出在最后一个函数中。它不喜欢我返回动态数组。我如何实现相同的功能(我想返回数据的字符串数组)?
pragma solidity ^0.4.6;
contract EmailIntegrity {
// Map an array of EmailIntegrityStructs for each email address.
// The first element will be used for the integrity record.
// The rest will be used for audit records.
enum ItemType { Integrity, Audit }
struct EmailIntegrityStruct {
ItemType itemType;
uint timestamp;
string data;
}
mapping(address => EmailIntegrityStruct[]) emailIntegrityStructs;
function hasEmailIntegrityData(address emailAddress) public constant returns(bool isEmail) {
return emailIntegrityStructs[emailAddress][0].timestamp == 0;
}
function insertIntegrityData(address emailAddress, uint timestamp, string data) public returns(bool success) {
if (hasEmailIntegrityData(emailAddress)) {
revert();
}
EmailIntegrityStruct memory integrityData;
integrityData.itemType = ItemType.Integrity;
integrityData.timestamp = timestamp;
integrityData.data = data;
emailIntegrityStructs[emailAddress].push(integrityData);
return emailIntegrityStructs[emailAddress].length == 1;
}
function insertAuditData(address emailAddress, uint timestamp, string data) public returns(bool success) {
if (!hasEmailIntegrityData(emailAddress)) {
revert();
}
EmailIntegrityStruct memory auditData;
auditData.itemType = ItemType.Audit;
auditData.timestamp = timestamp;
auditData.data = data;
emailIntegrityStructs[emailAddress].push(auditData);
return emailIntegrityStructs[emailAddress].length > 1;
}
function getIntegrityData(address emailAddress) public constant returns(string data) {
if (!hasEmailIntegrityData(emailAddress)) {
revert();
}
return emailIntegrityStructs[emailAddress][0].data;
}
function getAuditData(address emailAddress) public constant returns(string[] data) {
if (!hasEmailIntegrityData(emailAddress)) {
revert();
}
var length = emailIntegrityStructs[emailAddress].length;
string[] memory auditData = new string[](length - 1);
for (uint i = 1; i < length ; i++) {
auditData[i] = emailIntegrityStructs[emailAddress][i].data;
}
return auditData;
}
}
Run Code Online (Sandbox Code Playgroud)
Solidity 和 Javascript 允许嵌套数组,但我们无法将嵌套动态数组从 Solidity 拉到 JavaScript 世界。
这是solidity和javascript之间桥梁的限制。由于 Solidity 内部的字符串表示为动态数组,因此我们无法传输字符串数组。
从那时起,Solidity 不断发展,您可以返回包括结构的动态数组。测试合约:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Test {
struct User{
string name;
string LastName;
}
User[] public store;
function addToStorage() external returns (User[] memory ) {
User memory newUser=User(
"yilmads","bin"
);
store.push(newUser);
return store;
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说编译得很好。
我添加了 Solidity 版本的定义MyStruct
并将其升级到当前版本(尽管它pragma
也可以与旧版本一起编译)。这是我通过Remix编译的代码:
pragma solidity ^0.4.19;
contract MyContract{
struct MyStruct {
uint256 foo;
}
mapping(address => MyStruct[]) myStruct;
}
Run Code Online (Sandbox Code Playgroud)
您使用的是旧版本的 Solidity 编译器吗?(这^0.4.6
让我觉得也许你就是。)
你的是什么MyStruct
?也许更有趣的结构会失败。一般来说,请尝试提供完整的代码示例来重现您所遇到的问题。
归档时间: |
|
查看次数: |
2673 次 |
最近记录: |