锯齿交易错误:“尝试设置未经授权的地址" [英] Sawtooth Transaction error: "Tried to set unauthorized address"

查看:56
本文介绍了锯齿交易错误:“尝试设置未经授权的地址"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写我的自定义事务处理器.我正在为简单的Account类写作

 类帐户:def __init __(自身,名称,ac_number,余额):self.name =名称self.ac_number = ac_number自我平衡=平衡 

我的TP对于单个帐户来说运行良好.现在,我想针对多个帐户进行改进.为了获得每个帐号的不同状态,我更改了_'_ get_account_address_'函数.我正在关注@danintel的

我的州码是

 导入日志记录导入hashlib从sawtooth_sdk.processor.exceptions导入InternalErrorLOGGER = logging.getLogger(__ name__)FAMILY_NAME =帐户"#TF前缀是SHA-512("cookiejar"),a4d219的前6个字符AC_NAMESPACE = hashlib.sha512('account'.encode("utf-8")).hexdigest()[0:6]def _make_account_address(name):返回AC_NAMESPACE + \hashlib.sha512(name.encode('utf-8')).hexdigest()[:64]def _hash(数据):'''计算SHA-512哈希并以十六进制字符返回结果.''返回hashlib.sha512(data).hexdigest()def _get_account_address(from_key):'''从cookiejar TF返回cookiejar对象的地址.地址是哈希SHA-512(TF名称)中的前6个十六进制字符,加上哈希SHA-512(cookiejar公钥)的结果.'''返回_hash(FAMILY_NAME.encode('utf-8'))[0:6] + \_hash(from_key.encode('utf-8'))[0:64]班级帐户:def __init __(自身,名称,ac_number,余额):self.name =名称self.ac_number = ac_number自我平衡=平衡类AccountState:def __init __(自身,上下文):self._context =上下文def make_account(self,account_obj,from_key):'''烘烤(添加)``数量''的cookie.'''account_address = _make_account_address(account_obj.name)#不起作用#account_address = _get_account_address(from_key)#工作正常LOGGER.info('获得密钥%s和帐户地址%s.',from_key,帐户地址)state_str =,".join([str(account_obj.name),str(account_obj.ac_number),str(account_obj.balance)])state_data = state_str.encode('utf-8')地址= self._context.set_state({帐户地址:state_data})如果len(addresss)<1:引发InternalError(状态错误") 

解决方案

这可能已经得到了回答,但是我对添加评论的贡献较少.

您看到"试图设置未经授权的地址:"的错误是因为客户端没有在 TransactionHeader 的"输出"中包含这些地址.地址字段.

客户端可以在"输出"地址字段中提供前缀而不是完整地址,但是请谨慎使用此功能,因为这会影响并行事务调度.

请参考Cookiejar and XO_python projects. I am following xo code to get the address.

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 is working fine but _make_account_address showing error in cli

Tried to set unauthorized address

My state code is

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")

解决方案

This probably has been answered already, but I've lesser credits to add a comment.

The error you see "Tried to set unauthorized address: " is because client did not include these addresses in TransactionHeader's "outputs" addresses field.

It is possible for client to give prefix instead of complete address in "outputs" addresses field, but make use of this feature cautiously because it'll impact parallel transaction scheduling.

Please refer to https://sawtooth.hyperledger.org/docs/core/nightly/master/architecture/transactions_and_batches.html#dependencies-and-input-output-addresses for detailed understanding on different fields when composing TransactionHeader.

这篇关于锯齿交易错误:“尝试设置未经授权的地址"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆