Итак, я изучал Hyperledger Sawtooth для своего следующего проекта, и я хотел спросить, можно ли создавать разрешения на основе состояния блокчейна. Например, для семейства транзакций IntegerKey я хочу, чтобы только один конкретный пользователь изменил значение переменной X.
Разрешения на данные Hyperledger Sawtooth
Ответы (1)
Возможно. Логика смарт-контракта в вашем обработчике транзакций для IntegerKey должна проверять, что конкретный пользователь (вы намереваетесь) обновляет значение переменной X.
Готовый вариант identity-tp
поможет вам ограничить доступ к клиенту, который может выполнять транзакцию IntegerKey. Кроме того, это поможет вам ограничить запуск только разрешенного семейства транзакций в сети. Но когда дело доходит до конкретной переменной, это зависит от того, как вы решили сохранить значение в глобальном состоянии. После того, как вы решите, как сохранить переменную в глобальном состоянии, вы можете дополнительно использовать логику проверки, чтобы проверить, действительно ли транзакция отправлена нужным человеком.
Вы можете использовать заголовок транзакции, отправленный в TpProcessRequest. Это то, что вы видите в apply()
методе вашего обработчика транзакций. Вы получаете информацию об открытом ключе как дозатора, так и лица, подписывающего транзакцию, из заголовка транзакции.
Ниже объясняется, как это сделать в Go:
В случае Go SDK - это то, как контекст передается apply()
методу обработчика транзакций. Обратите внимание на параметр заголовка в запросе /github.com/hyperledger/sawtooth-sdk-go/blob/8422a911dbc13e735f3acbcc593914521468697d/protos/processor.proto#L82. Обратите внимание на информацию об открытом ключе подписывающей стороны github.com/hyperledger/sawtooth-sdk-go/blob/8422a911dbc13e735f3acbcc593914521468697d/protos/transaction.proto#L54.
Допустим, вы используете settings-tp
и храните свой собственный ключ настроек, чтобы знать разрешенных пользователей для каждого значения. В случае переменной X это будет что-то вроде settings.variable.X=[List of <PUBLIC_KEY_OF_USER_INTENDED_FOR_X>]
. В обработчике транзакций вы можете увидеть, обновляется ли эта переменная X. Если да, то прочтите ключ настроек, который вы сохранили ранее. Проверьте, совпадает ли открытый ключ с ключом в заголовке запроса транзакции.