从客户端的锯齿地址获取数据
Get data from sawtooth address on clientside
我已将数据以 protobuf 格式存储在一个地址(由 public 密钥和交易系列创建的地址)上。
获取请求是在
http://rest-api:8008/state/
获取格式为
的数据
{
"data": "CkIwM2FjNjA3MTUzZmRlMzJhNzhiNDFlMzkxN2QwZDlkZmJmMmM2NjZmOWFhZGMzMWRiNTNjODZhNzFkNDMyNmZkNGUSBnNlbGxlchoROTc4LTAtNTc2LTUyMzk1LTAiETgxOS02OTAtNzk4Nng1MTE5Kg0xLTk4MTAtMTE0NS01",
"head": "bea2911b4d84b897300fc4a9eb6b56b7ddc59c88c115dab6c09935d658b57cf229b538a3cb3d407647211c8847e46db07f9cff65af2835dfc7732be9b443fae3",
"link": "http://192.168.1.13:8008/state/318c9fa678220444fb9b209a57c849320a7f61c984e5b8a6a56880030728bdb530a5d0?head=bea2911b4d84b7c7300fc4a9eb6b56b7ddc59c88c115dab6c09935d658b57cf229b538a3cb3d407647211c8847e46db07f9cff65af2835dfc7732be9b443fae3"
}
我在 sawtooth-rest-api 上发布了帐户数据,如果详细信息正确(由处理器检查),带有额外 "Public Key" 的帐户将被插入区块链。这是帐户 protobuf class,它在被插入到区块链之前被序列化了。
message Account {
string public_key = 1;
string user_type = 2;
string adhaar_number = 3;
string phone_number = 4;
string pan_card_number = 5;
}
transaction = Account()
transaction.ParseFromString( base64.b64decode(data.encode()))
THat just gave a number 129.
更新:
账户数据序列化输出为
b'\nB033c10fa02a3b602f008e7837a48d4492f5105417111404c4404b49f51222d30c1\x12$60405711-dd32-47c1-a914-3e19ee5177b1\x1a\x06seller"
\x11978-1-61207-456-6*\x10+64(0)19727879362\r0-609-80129-5'
当我对它进行 base64 编码时,它给出的字符串与我从数据键下的锯齿 api 获得的字符串完全相同。
但不知何故 transaction.ParseFromString 只给出了一个 3 位数的整数,无法取回帐户。
抱歉,我想通了:
之后
account=transaction.ParseFromString(<serializedBytes>)
可以像普通 class 变量一样访问帐户详细信息。
account.public_key
account.adhaar_number
如果我的理解是正确的,您检索相对于 REST 的数据 API /state/xxxx
或 /state?address=xxxx.
当数据通过 setState
或类似调用在 TransactionProcessor 中放在链上时,它首先进行 base64 编码。
您将需要进行 base64 解码,然后 ParseFromString
该结果。
我已将数据以 protobuf 格式存储在一个地址(由 public 密钥和交易系列创建的地址)上。 获取请求是在 http://rest-api:8008/state/ 获取格式为
的数据{
"data": "CkIwM2FjNjA3MTUzZmRlMzJhNzhiNDFlMzkxN2QwZDlkZmJmMmM2NjZmOWFhZGMzMWRiNTNjODZhNzFkNDMyNmZkNGUSBnNlbGxlchoROTc4LTAtNTc2LTUyMzk1LTAiETgxOS02OTAtNzk4Nng1MTE5Kg0xLTk4MTAtMTE0NS01",
"head": "bea2911b4d84b897300fc4a9eb6b56b7ddc59c88c115dab6c09935d658b57cf229b538a3cb3d407647211c8847e46db07f9cff65af2835dfc7732be9b443fae3",
"link": "http://192.168.1.13:8008/state/318c9fa678220444fb9b209a57c849320a7f61c984e5b8a6a56880030728bdb530a5d0?head=bea2911b4d84b7c7300fc4a9eb6b56b7ddc59c88c115dab6c09935d658b57cf229b538a3cb3d407647211c8847e46db07f9cff65af2835dfc7732be9b443fae3"
}
我在 sawtooth-rest-api 上发布了帐户数据,如果详细信息正确(由处理器检查),带有额外 "Public Key" 的帐户将被插入区块链。这是帐户 protobuf class,它在被插入到区块链之前被序列化了。
message Account {
string public_key = 1;
string user_type = 2;
string adhaar_number = 3;
string phone_number = 4;
string pan_card_number = 5;
}
transaction = Account()
transaction.ParseFromString( base64.b64decode(data.encode()))
THat just gave a number 129.
更新: 账户数据序列化输出为 b'\nB033c10fa02a3b602f008e7837a48d4492f5105417111404c4404b49f51222d30c1\x12$60405711-dd32-47c1-a914-3e19ee5177b1\x1a\x06seller" \x11978-1-61207-456-6*\x10+64(0)19727879362\r0-609-80129-5'
当我对它进行 base64 编码时,它给出的字符串与我从数据键下的锯齿 api 获得的字符串完全相同。 但不知何故 transaction.ParseFromString 只给出了一个 3 位数的整数,无法取回帐户。
抱歉,我想通了:
之后account=transaction.ParseFromString(<serializedBytes>)
可以像普通 class 变量一样访问帐户详细信息。
account.public_key
account.adhaar_number
如果我的理解是正确的,您检索相对于 REST 的数据 API /state/xxxx
或 /state?address=xxxx.
当数据通过 setState
或类似调用在 TransactionProcessor 中放在链上时,它首先进行 base64 编码。
您将需要进行 base64 解码,然后 ParseFromString
该结果。