Ошибка транзакции Sawtooth: «Попытка установить неавторизованный адрес» - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь написать свой собственный процессор транзакций.Я пишу для простого класса учетной записи

class Account:
    def __init__(self, name, ac_number, balance):
        self.name = name 
        self.ac_number = ac_number
        self.balance = balance 

Мой TP работает нормально для одной учетной записи.Теперь я хочу улучшить его для нескольких учетных записей.Чтобы получить разные состояния для каждого номера счета, я изменил функцию _'_ get_account_address_ '.Я слежу за проектами @danintel Cookiejar и XO_python .Я следую за кодом XO, чтобы получить адрес.

AC_NAMESPACE = hashlib.sha512('account'.encode("utf-8")).hexdigest()[0:6]

def _make_account_address(name):
    return AC_NAMESPACE + \
        hashlib.sha512(name.encode('utf-8')).hexdigest()[:64]  

_get_account_address работает нормально, но _make_account_address показывает ошибку в cli

Пытался установить неавторизованный адрес

enter image description here

Мой код штата

import logging
import hashlib
from sawtooth_sdk.processor.exceptions import InternalError

LOGGER = logging.getLogger(__name__)


FAMILY_NAME = "account"
# TF Prefix is first 6 characters of SHA-512("cookiejar"), a4d219

AC_NAMESPACE = hashlib.sha512('account'.encode("utf-8")).hexdigest()[0:6]


def _make_account_address(name):
    return AC_NAMESPACE + \
        hashlib.sha512(name.encode('utf-8')).hexdigest()[:64]

def _hash(data):
    '''Compute the SHA-512 hash and return the result as hex characters.'''
    return hashlib.sha512(data).hexdigest()

def _get_account_address(from_key):
    '''
    Return the address of a cookiejar object from the cookiejar TF.

    The address is the first 6 hex characters from the hash SHA-512(TF name),
    plus the result of the hash SHA-512(cookiejar public key).
    '''
    return _hash(FAMILY_NAME.encode('utf-8'))[0:6] + \
                 _hash(from_key.encode('utf-8'))[0:64]

class Account:
    def __init__(self, name, ac_number, balance):
        self.name = name 
        self.ac_number = ac_number
        self.balance = balance 


class AccountState:
    def __init__(self, context):
        self._context = context 

    def make_account(self, account_obj, from_key):
        '''Bake (add) "amount" cookies.'''
        account_address = _make_account_address(account_obj.name) # not working 
        #account_address = _get_account_address(from_key) # working fine
        LOGGER.info('Got the key %s and the account address %s.',
                    from_key, account_address)

        state_str = ",".join([str(account_obj.name), str(account_obj.ac_number), str(account_obj.balance)])
        state_data = state_str.encode('utf-8')
        addresses = self._context.set_state({account_address: state_data})

        if len(addresses) < 1:
            raise InternalError("State Error")

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это означает, что процессор транзакций попытался установить (поместить) значение, отсутствующее в списке выходных данных.Это происходит, когда клиент отправляет транзакцию с неточным списком входов / выходов.

Убедитесь, что адрес Sawtooth имеет правильную длину - адрес состоит из 70 шестнадцатеричных символов, которые представляют 35-байтовый адрес (включая6 шестнадцатеричный символ или 3-байтовый префикс семейства транзакций).

Кроме того, вы можете установить список выходов пустым - это позволит записывать все адреса (за счет безопасности и эффективности).Лучше настроить входы и выходы для адресов состояний, которые вы изменяете - это позволяет проводить транзакции параллельно (если вы запускаете sawtooth-validator --scheduler parallel -vv) и является более безопасным и безопасным, поскольку процессор транзакций не может записывать в адреса состояний за пределамисписок.

0 голосов
/ 13 февраля 2019

Возможно, на этот вопрос уже дан ответ, но у меня меньше кредитов для добавления комментария.

Вы видите сообщение об ошибке " Попытка установить неавторизованный адрес: " из-за того, что клиент не сделалвключите эти адреса в TransactionHeader в поле адресов " output ".

Клиент может указать префикс вместо полного адреса в " output"поле адресов, но используйте эту функцию осторожно, потому что это повлияет на планирование параллельных транзакций.

Пожалуйста, обратитесь к https://sawtooth.hyperledger.org/docs/core/nightly/master/architecture/transactions_and_batches.html#dependencies-and-input-output-addresses для подробного понимания различных полей при составлении TransactionHeader.

...