Я пытался добавить методы в контракт, но он стал настолько большим, что я не мог развернуть его с помощью трюфеля. Теперь мне нужно создать другой контракт, который будет вызываться вместо исходного контракта для обработки данных, хранящихся в исходном контракте, в качестве переменной состояния.
Переменная, которую я собираюсь обработать, является отображением.
Я пытаюсь сделать что-то вроде этого:
contract Original {
mapping(bytes32 => Person) private Persons;
/* many structs and methods here */
}
contract SecondContract {
function processdata(){
/* here i want to process the data stored in the mapping in the first contract */
}
}
как мне получить связь между двумя контрактами и иметь возможность обрабатывать эти данные?
Если я правильно понимаю, вы просто хотите получить доступ к данным, хранящимся в Original
. Если это так, вы можете сделать что-то вроде этого:
contract Original {
mapping(bytes32 => Person) public persons;
}
contract SecondContract {
Original original;
function SecondContract(address ofOriginalContract) {
original = Original(ofOriginalContract);
}
function processData(bytes32 someBytes) {
Person entry = original.persons[someBytes];
// do something with entry
}
}
Обратите внимание, что я сделал persons
сопоставление public
, поэтому мы можем получить к нему доступ из другого контракта.
Усиление ответа @Travis.
Эта линия
Original original;
добавляет значительный размер, SecondContract
потому что он содержит файлы Original
.
Это отдельная проблема, которую можно решить с помощью интерфейса. SecondContract
не требует полного байт-кода для Original
. Это повторяется и не нужно. Ему нужна только сигнатура функции и адрес экземпляра для связи.
Есть некоторые сложные проблемы наследования и приведения типов, которые нужно распутать, чтобы SecondContract
можно было наследовать наименьшее возможное представление Original
площади поверхности (но не рабочий код), и оба контракта могут быть идеально синхронизированы в отношении макета Person
. Решил для тебя поковыряться. Вы можете экстраполировать это на более сложную ситуацию.
SecondContract
будет намного меньше, потому что interfaces
он наследует никогда не станет очень большим.
pragma solidity 0.8.1;
interface Types {
struct Person {
uint age;
string name;
}
}
interface IOriginal is Types {
function persons(bytes32) external view returns(uint, string memory);
}
contract Original is IOriginal {
mapping(bytes32 => Person) public override persons;
}
contract SecondContract is Types {
IOriginal original;
constructor(address ofOriginalContract) {
original = IOriginal(ofOriginalContract);
}
function processData(bytes32 someBytes) public {
(uint age, string memory name) = original.persons(someBytes);
// do something with entry
}
}
Было бы более удовлетворительно, если бы function persons()
он вернул a Person
вместо членов, struct
но у меня не получилось. Возможно, добрая душа подскажет решение.
Надеюсь, поможет.
Каки Мастер Времени
processData
функции к исходному контракту.