как заставить пользователей подписывать разные строки своим закрытым ключом отдельно

Вот сценарий.

Пользователи приходят на мой сайт и регистрируются (используя адрес электронной почты и пароль). Затем они входят в систему. После этого они добавляют новый элемент (с полями имени и количества). После нажатия кнопки «Отправить», что происходит во внешнем или внутреннем интерфейсе, я генерирую такое же количество UUID, что и количество, которое он указал. Например, если он добавил новый элемент ("Toy123", 15), я генерирую 15 UUID на этой странице. Затем мне нужно, чтобы этот пользователь подписал эти UUIDS своим закрытым ключом. Дело в том, что я мог бы объединить все 15 UUID в один и позволить пользователю подписать этот последний своим закрытым ключом, но мне не нравится этот вариант, потому что мне нужны разные типы подписей для каждого uuid, потому что каждый uuid означает каждый элемент и каждый предмет отличается. Так что мне нужно, чтобы он подписывал эти uuids отдельно. Я попробовал метамаску, но это не здорово, потому что подписывать отдельно, metamask выводит диалоговое окно подтверждения для каждого uuid. Представьте, если бы пользователь указал 150 uuid, 150 диалогов подтверждения? Не кажется большим. Вот почему я не хочу использовать метамаску. Второй вариант — запросить у пользователя его приватный ключ, а затем программно подписать каждый uuid, но если я попрошу у пользователя его приватный ключ, он испугается.

Я попытался объяснить всю ситуацию, с которой столкнулся. Вопрос в следующем: что мне делать, чтобы отдельно подписывать uuids пользователя с его закрытым ключом, не спрашивая его закрытый ключ? Возможно ли это с метамаской?

Ответы (1)

Вы не можете. Metamask следует системе 1 диалога, 1 подписи для безопасности пользователей. Если вы хотите выполнять подобные действия, вам нужно будет реализовать свой собственный подписанный (web3 имеет прямую поддержку для этого) и попросить пользователя ввести закрытый ключ. Обратите внимание, что вы можете сделать это полностью на устройстве пользователя, и ключ не нужно отправлять на ваш сервер.

Тем не менее, вы все еще можете сделать это с 1 сигналом на партию. Просто попросите пользователя подписать корень Меркла из n значений. Если в какой-то момент в будущем пользователь захочет передать/изменить/продать только одно из этих n значений, вы можете создать новую подпись на старом корне merkle и преобразовании, происходящем в это время. Это по-прежнему позволяет вашему пользователю подтвердить право собственности и авторизовать изменения, не требуя n подписей для начала.