Что такое контейнер BigMap и почему он важен?
1 ответ
- голосов
-
- 2019-02-22
- Контейнер BigMap - это специальная карта (словарь),память которой читается или записывается для каждого ключа по запросу.
Мотивация к обладанию такой тарой следующая. Предположим,у вас есть контракт,содержащий множество более или менее независимых данных,и вы не хотите читать/записывать все данные сразу,а только небольшую их часть. Подумайте о крипто-котиках,коллекциях,STO (токенах безопасности) и т. Д. В целом,гораздо более эффективно с точки зрения ресурсов (газа и времени выполнения) получать доступ только к той части,которая вам нужна,а не загружать все.
-
Ограничение только одним контрактом на самом деле сделано для простоты реализации Майкельсона.
-
В сегодняшней реализации наличие только одной BigMap означает,что если вам нужны две такие вещи,map1 иmap2,вам нужно закодировать смешиваниеmap1 иmap2,выполнив что-то вроде:
key=Левая клавиша1| Правая клавиша2
Примером,когда вы хотели бы иметь две такие карты,может быть договор,который представляет недвижимость и владельцев или предметы коллекционирования и владельцев. Вы можете получить доступ к владельцам некоторых товаров или товаров некоторых владельцев.
Я лично считаю,что было бы неплохо снять это ограничение с Майкельсона.
- The BigMap container is a special map (dictionary) whose storage is only read or written per key on demand.
The motivation to have such a container is the following. Suppose that you have a contract containing lots of more or less independent data and you don't want to read / write all of the data at once but only a small part of it. Think of crypto-kitties, collections, STOs (security tokens), etc. It is in general much more efficient resource wise (gas and execution time) to only access the part you need instead of loading everything.
The limitation of only one per contract is really for simplicity purposes in the Michelson implementation.
With today's implementation, having only one BigMap means that if you need two such things map1 and map2, you need to encode the mixing of map1 and map2 by doing something like:
key = Left key1 | Right key2
An example where you would wish to have two such maps can be a contract that represents real estate and owners or collectibles and owners. You may wish to access owners of some goods or goods of some owners.
I personally think that lifting this restriction in Michelson would be nice.
-
К сожалению,вы не можете использовать типы сумм в качестве ключей к большим картам,потому что типы сумм не сопоставимы (без уважительной причины).Вам нужно будет использовать хэш типа солнца или его упакованное байтовое представление.Unfortunately, you can't use sum types as keys to bigmaps because sum types aren't comparable (for no good reason). You would have to use the hash of the sun type, or its packed byte representation.
- 1
- 2019-03-19
- Arthur B
-
@ArthurB Я пропустил это ограничение,когда писал этот ответ.Спасибо за точность.Было бы разумно в конечном итоге снять это ограничение (и,я думаю,сделать также единицы и опции).@ArthurB I missed this limitation when I wrote this answer. Thanks for the precision. It might be reasonable to lift this restriction eventually (and do unit and option as well I guess).
- 0
- 2019-03-19
- FFF
-
... и пара. И да,это довольно простой патч,чтобы сделать эти типы сопоставимыми.... and Pair. And yes, it's a pretty straightforward patch to make these types comparable
- 1
- 2019-03-20
- Arthur B
Я слышал во многих местах,что Tezos использует особый тип контейнера,называемый BigMap,для хранения данных внутри смарт-контракта.
Объект должен быть относительно сложным,потому что до сих пор в одном смарт-контракте разрешен только один экземпляр BigMap.
У меня следующие вопросы: