Есть ли способ, которым я могу иметь смарт-контракт, который хранит значение и имя, а затем может вызываться из другого смарт-контракта? Что-то вроде этого .. (но это работает)
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
}
}
Я начал с вашего примера и адаптировал его, пока он не заработал. Несколько указателей, которые я заметил, делая это.
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, чтобы показать, как это работает.
Надеюсь, поможет.
фетт