Сопоставление нескольких ключей в сопоставлении с одной структурой

Я провел некоторое исследование сопоставлений и структур и знаю, что можно хранить структуры в сопоставлении как значение, но не как ключ .

Я пытаюсь создать сопоставление адресов => структур, где несколько адресов указывают на одну и ту же структуру.

Например, у меня есть следующая тестовая структура и сопоставление.

struct test{
uint nonce;
address friend;
}

mapping (address => test) testMapping;

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

Если бы мне пришлось писать следующий код, делал бы я копию данных внутри структуры или просто указывал бы два разных ключа на одно и то же место в памяти в рамках сопоставления?

testMapping[address1].nonce = 1;
testMapping[address1].friend = address2;
testMapping[address3] = testMapping[address1];

AKA, выполняйте ли приведенные выше команды копирование значений из testMapping[address1] в testMapping[address2] или просто указывает testMapping[address2] на ту же ячейку памяти, что и testMapping[address1], и в этом случае, когда я обновляю один, оба обновляются?

Спасибо за любую помощь.

Ответы (2)

Да, вы бы сделали копию.

Вместо этого вы могли бы просто иметь массив, testsа затем сопоставлять адреса с индексами массива.

struct test{
    uint nonce;
    address friend;
}

mapping (address => uint) testMapping; //Maps addresses to index in `tests`
test[] tests;
Спасибо за ответ. Быстрый дополнительный вопрос. Скажем, я хотел добавить новый тест в массив. Я предполагаю, что не могу выполнить test.push(INFO), поскольку это структура. Как тогда увеличить размер такого массива? Спасибо еще раз.

"буду ли я делать копию данных внутри структуры?"

Да.

Это, как правило, становится дороже с размером структуры.

Похоже, вы хотите создать табличное хранилище для людей с ассоциацией «многие ко многим» с другими людьми. Это выполнимо, используя сопоставления для произвольного доступа и массивы для списков ключей. Здесь у человека есть список друзей.

struct PersonStruct {
    string data1;
    uint data2;
    address[] friends;
}

mapping (address => PersonStruct) personStructs;

Это действительно упрощенно; просто чтобы помочь вам подумать о возможностях. Вы сможете перечислить список «друзей» для данного человека с помощью нескольких функций, которые помогут.

Рассмотрим функцию, которая возвращает количество друзей, хранящихся в списке внутри структуры Person:

function personFriendCount(address person) constant returns(uint count) {
    return personStructs[person].friends.length;
}

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

function personFriendAtIndex(address person, uint index) constant returns(address friendAddress) {
    return personStructs[person].friends[index];
}

Имея в руках ключ друга, клиент может получить структуру для получения подробной информации.

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