Как вы можете выяснить, существует ли определенный ключ в сопоставлении, Struct определен внутри библиотеки (в Solidity)?

pragma solidity ^0.4.8;

library Library {
  struct data {
     unit val;
   }
}

-

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id] == address(0) ){ //error occurs!
            clusterContract[id] = list;
            return true;
        }
        return false; 
    }
}

Следующее сравнение if(clusterContract[id] == address(0)) дает ошибку. Ошибка, с которой я столкнулся:

Operator == not compatible with types struct Library.data storage ref and address
E               if(clusterContract[id] == address(0) ){...

[Q] Как я могу исправить эту ошибку?

Благодарим вас за ценное время и помощь.

20 голосов | спросил alper 13 MarpmMon, 13 Mar 2017 12:23:49 +03002017-03-13T12:23:49+03:0012 2017, 12:23:49

2 ответа


20

Вы не можете напрямую узнать, существует ли какой-либо ключ в сопоставлении, потому что все они существуют.

mapping(key => value) name;

создает пространство имен, в котором существуют все возможные ключи, а значения инициализируются на 0 /false.

Если вы хотите проверить, что значение было явно задано, а не просто по умолчанию (0), вам нужно что-то программировать. В некоторых случаях value > 0 достаточно, но если 0 имеет смысл в вашем приложении, то другой член структуры может помочь ... bool isValue;, например.

Библиотека
library Library {
  struct data {
     uint val;
     bool isValue;
   }
}

contract Array{

    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].isValue) throw; // duplicate key
        // insert this 
        return true; 
    }
}

Я заметил, что «addCluster» имеет вид фабрики контрактов (в процессе), поэтому вы, вероятно, намерены отслеживать контракты, созданные по ходу дела.

Я собрал небольшое резюме различных способов организации общих шаблонов данных в Solidity. Это может помочь найти здесь: Блог: простые шаблоны хранения в Твердость

Надеюсь, это поможет.

ответил Rob Hitchens B9lab 13 MarpmMon, 13 Mar 2017 15:35:29 +03002017-03-13T15:35:29+03:0003 2017, 15:35:29
1

Это решение кажется рабочим, но я открыт для любых советов.

В C следующее не должно работать, поскольку clusterContract[id].flag не существует в первом вызове для создания карты для id. Но в этом примере clusterContract[id].flag != 1 возвращает true на начальном этапе для создания карты из id. После clusterContract[id].flag, назначенного 1 clusterContract[id].flag != 1 возвращает false.

pragma solidity ^0.4.8;

library Library {
  struct data {
     uint val;
     uint8 flag;
   }
}

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].flag != 1 ){ 
            clusterContract[id] = list;
            clusterContract[id].flag = 1;
            return true;
        }
        return false; 
    }
}
ответил alper 13 MarpmMon, 13 Mar 2017 15:31:20 +03002017-03-13T15:31:20+03:0003 2017, 15:31:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132