Твердость сохранить сложный объект в договоре - PullRequest
0 голосов
/ 02 июля 2018

У меня есть этот сценарий использования, в котором мне нужно сохранить следующие примерные данные в моем контракте.

{
    Linkage : {"4" : "1", "77" : "59", "5" : "64", "4" : "464", "455" : "364", "25" : "364", "25" : "164", "55" : "8684", "85" : "864"},
    UserId : "Some Id",
}

Словарь явно расширяемый (root And Linkage). Я хочу отправить данные и получить их как объект (c # и стиль Java). Поэтому, когда я общаюсь с WEB3, я могу передать JSON. Это возможно?

Вот где я застрял ...

pragma solidity ^0.4.13;

contract Test{         
  struct UserProfile{       
    string UserId;
  }   

  UserProfile public Profile;

  function setProfile(UserProfile newProfile) public {
    Profile  = newProfile;
  }        
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете сериализовать ваш объект в строку, у Solidity нет примитива объекта и, вероятно, никогда не будет из-за природы Ethereum vm.

0 голосов
/ 02 июля 2018

Вы не можете передавать объекты при инициации транзакции (пока). Вы можете только передавать / возвращать вызовы функций struct через internal ( см. Часто задаваемые вопросы о твердости ).

Вам нужно будет передать свои данные, используя примитивные типы, и добавить их к своему внутреннему struct:

pragma solidity ^0.4.13;

contract Test { 
  struct UserProfile {
    string userId;
    mapping(uint256 => uint256) linkage;
  }   

  UserProfile public profile;

  function addLinkage(uint256 id, uint256 value) public {
    profile.linkage[id] = value;
  }
}

Обратите внимание: если вы хотите передать ваши ссылки оптом, вы можете использовать addLinkage(uint256[] ids, uint256[] values).

...