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

1
Snorlaxative 3 Июл 2017 в 09:17
(если нет) Одно из решений, о котором я подумал, - это взять имя в качестве аргумента и добавить к нему некоторый суффикс, например Name.mobile_no.x, где x на 1 больше, чем последнее число с аналогичной записью, запрашивая имя в цепочке блоков до тех пор, пока запись с добавленным номером не отображается. Есть идеи получше?
 – 
Snorlaxative
3 Июл 2017 в 09:38

1 ответ

Лучший ответ

Что вам нужно сделать, так это закодировать значение в формате JSON и сохранить его маршалированным для данного ключа, например, вы можете определить структуру с срезом, обновлять / добавлять срез каждый раз с новым значением, маршалировать в байтовый массив, а затем сохранять в бухгалтерскую книгу.

При каждом обновлении вы читаете массив байтов из реестра, демаршалируете его обратно в структуру, обновляете требуемой информацией и сохраняете обратно с тем же ключом.


Для получения истории изменений вы можете использовать один из методов из ChaincodeStubInterface

// Chaincode interface must be implemented by all chaincodes. The fabric runs
// the transactions by calling these functions as specified.
type ChaincodeStubInterface interface {


// Other methods omitted

    // GetHistoryForKey returns a history of key values across time.
    // For each historic key update, the historic value and associated
    // transaction id and timestamp are returned. The timestamp is the
    // timestamp provided by the client in the proposal header.
    // GetHistoryForKey requires peer configuration
    // core.ledger.history.enableHistoryDatabase to be true.
    // The query is NOT re-executed during validation phase, phantom reads are
    // not detected. That is, other committed transactions may have updated
    // the key concurrently, impacting the result set, and this would not be
    // detected at validation/commit time. Applications susceptible to this
    // should therefore not use GetHistoryForKey as part of transactions that
    // update ledger, and should limit use to read-only chaincode operations.
    GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)


}
2
Artem Barger 3 Июл 2017 в 10:15
Спасибо! Я также хотел включить всю историю измененных атрибутов в причину реестра, что в моем случае является полезной информацией (например, по телефонным номерам). Есть ли способ реализовать это тоже?
 – 
Snorlaxative
3 Июл 2017 в 10:11
Я обновил свой ответ, подумайте об использовании API GetHistoryForKey.
 – 
Artem Barger
3 Июл 2017 в 10:16
Рассмотрите возможность регистрации в chat.hyperledger.org, это приложение RocketChat для Hyperledger.
 – 
Artem Barger
3 Июл 2017 в 10:23