Отправка/вытягивание данных из контракта на хранение данных

Есть ли способ, которым я могу иметь смарт-контракт, который хранит значение и имя, а затем может вызываться из другого смарт-контракта? Что-то вроде этого .. (но это работает)

Contract D {
    struct Document{
      string name;
      uint value;
    }

    function StoreDocument(bytes32 key, string name, uint value) returns (bool success) {
     var doc = Document(name, value);
     documents[key].push(doc);
     return true;
    }
}

И затем я хотел бы, чтобы другой контракт брал ключ, адрес контракта и имя и мог возвращать значение для использования в контракте. Любая помощь будет здорово.

Contract E {
    function RetrieveData(address ConDadd, bytes32 key, string name) {
    //some funciton to get the data from Contract D
    }
}

Ответы (1)

Я начал с вашего примера и адаптировал его, пока он не заработал. Несколько указателей, которые я заметил, делая это.

structопределяет Тип. Вы должны привести переменную с этим типом к значениям хранилища. mappingэто инструмент для организации экземпляров по уникальному ключу.

Я изменил тип nameна, bytes32потому что в настоящее время невозможно передавать строки между контрактами.

E потребуется знание ABI для D, чтобы он мог совершать звонки. D находится в том же исходном файле, поэтому компилятор может «увидеть» его, когда встретит эту строку, которая приводит переменную к типу «D».

D d;

E также необходимо знать адрес экземпляра D, с которым он должен разговаривать. Конструктор для E ожидает адрес, переданный при его развертывании.

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

pragma solidity ^0.4.6;

contract D {

  // This is a Type
  struct DocumentStruct{
    // Not possible to pass strings between contracts at this time
    bytes32 name;
    uint value;
  }

  // This is a namespace where we will store docs of Type DocumentStruct
  mapping(bytes32 => DocumentStruct) public documentStructs;

  // Set values in storage
  function StoreDocument(bytes32 key, bytes32 name, uint value) returns (bool success) {
   documentStructs[key].name  = name;
   documentStructs[key].value = value;
   return true;
  }

}

contract E {

  // "d" is of type "D" which is a contract ^
  D d;

  // Define the Type in this context
  struct DocumentStruct{
    bytes32 name;
    uint value;
  }    

  // For this to work, pass in D's address to E's constructor
  function E(address DContractAddress) {
    d = D(DContractAddress);
  }

  function RetrieveData(bytes32 key) 
    public
    constant
    returns(bytes32, uint) 
  {
    // Declare a temporary "doc" to hold a DocumentStruct
    DocumentStruct memory doc;
    // Get it from the "public" mapping's free getter.
    (doc.name, doc.value) = d.documentStructs(key);
    // return values with a fixed sized layout
    return(doc.name, doc.value);
  }
}

Существуют всевозможные неочевидные соображения по организации данных, которые на ранних этапах могут вызвать затруднения. Может быть полезно посмотреть на сильные и слабые стороны различных шаблонов, раскрытых здесь: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?

Вот приведенное выше в Remix, чтобы показать, как это работает.

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

введите описание изображения здесь

Ты качаешь Роба! Это как раз то, что мне было нужно, и спасибо за указатели.