Можно ли в контракте, используя Solidity, сохранить указатель на переменную хранения в переменной хранения (или где-то еще, что может быть подходящим) и получить к ней доступ из отдельных функций?
Рассмотрим следующий пример в псевдокоде Solidity:
contract AContract {
struct AStruct {
uint a_field;
}
AStruct variable_a;
AStruct variable_b;
AStruct storage pointer_to_either_a_or_b;
modifier AModifier()
{
if (condition_a)
{
pointer_to_either_a_or_b = variable_a;
}
else
{
pointer_to_either_a_or_b = variable_b;
}
}
function AFunctionUsingPointerToAorB100() internal AModifier()
{
pointer_to_either_a_or_b.a_field = 100;
}
function AFunctionUsingPointerToAorB200() internal AModifier()
{
pointer_to_either_a_or_b.a_field = 200;
}
}
Всякий раз, когда я пытаюсь использовать ключевое слово «storage» для переменной хранилища, я получаю следующую ошибку компиляции для «AStruct storage pointer_to_either_a_or_b»:
Ошибка: ожидаемый идентификатор, получено «Хранилище»
Есть ли способ обойти это, например, поместив указатель в другое место в коде?
Удаление ключевого слова storage at AStruct storage pointer_to_either_a_or_b;
устранит ошибку (поскольку переменные состояния всегда имеют значение storage ), но вы не сможете добиться того, что пытаетесь сделать.
Причина в том; поскольку AStruct pointer_to_either_a_or_b;
это переменная хранения, присвоение ей значения создаст независимую копию, а не ссылку на variable_a
или variable_b
. Это упоминается в документах Solidity здесь ,
назначения между хранилищем и памятью, а также переменной состояния ( даже из других переменных состояния ) всегда создают независимую копию.
Я не знаю, каково ваше фактическое требование, но в зависимости от того, что вы разместили здесь, я не буду использовать модификатор (и никаких указателей), но попробую что-то вроде этого,
function sample(uint _val) public // val = 100 or 200
{
if (condition_a)
{
variable_a.a_field = _val;
}
else
{
variable_b.a_field = _val;
}
}
Надеюсь это поможет!
К вашему сведению: насколько я знаю, локальные переменные, объявленные внутри модификаторов, недоступны внутри функции.
getPointer()
потому что возвращаемое значение будет копией переменной, и оно не будет указывать на переменную состояния и изменять ее.
pabloruiz55