Skip to content

Commit

Permalink
Enhancement: Add State Proof support (#370)
Browse files Browse the repository at this point in the history
* add stateproof support
  • Loading branch information
shiqizng committed Aug 25, 2022
1 parent 9f49624 commit 08efd34
Show file tree
Hide file tree
Showing 7 changed files with 317 additions and 3 deletions.
3 changes: 3 additions & 0 deletions algosdk/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
"""str: indicates an asset transfer transaction"""
APPCALL_TXN = "appl"
"""str: indicates an app call transaction, allows creating, deleting, and interacting with an application"""
STATEPROOF_TXN = "stpf"
"""str: indicates an state proof transaction"""

# note field types
NOTE_FIELD_TYPE_DEPOSIT = "d"
Expand Down Expand Up @@ -134,3 +136,4 @@
logic_sig_max_cost = LOGIC_SIG_MAX_COST
logic_sig_max_size = LOGIC_SIG_MAX_SIZE
app_page_max_size = APP_PAGE_MAX_SIZE
stateproof_txn = STATEPROOF_TXN
83 changes: 83 additions & 0 deletions algosdk/future/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,11 @@ def undictify(d):
elif txn_type == constants.appcall_txn:
args.update(ApplicationCallTxn._undictify(d))
txn = ApplicationCallTxn(**args)
elif txn_type == constants.stateproof_txn:
# a state proof txn does not have these fields
args.pop("note"), args.pop("rekey_to"), args.pop("lease")
args.update(StateProofTxn._undictify(d))
txn = StateProofTxn(**args)
if "grp" in d:
txn.group = d["grp"]
return txn
Expand Down Expand Up @@ -2906,6 +2911,84 @@ def __eq__(self, other):
return False


class StateProofTxn(Transaction):
"""
Represents a state proof transaction
Arguments:
sender (str): address of the sender
state_proof (dict(), optional)
state_proof_message (dict(), optional)
state_proof_type (str, optional): state proof type
sp (SuggestedParams): suggested params from algod
Attributes:
sender (str)
sprf (dict())
sprfmsg (dict())
sprf_type (str)
first_valid_round (int)
last_valid_round (int)
genesis_id (str)
genesis_hash (str)
type (str)
"""

def __init__(
self,
sender,
sp,
state_proof=None,
state_proof_message=None,
state_proof_type=None,
):
Transaction.__init__(
self, sender, sp, None, None, constants.stateproof_txn, None
)

self.sprf_type = state_proof_type
self.sprf = state_proof
self.sprfmsg = state_proof_message

def dictify(self):
d = dict()
if self.sprf_type:
d["sptype"] = self.sprf_type
if self.sprfmsg:
d["spmsg"] = self.sprfmsg
if self.sprf:
d["sp"] = self.sprf
d.update(super(StateProofTxn, self).dictify())
od = OrderedDict(sorted(d.items()))

return od

@staticmethod
def _undictify(d):
args = {}
if "sptype" in d:
args["state_proof_type"] = d["sptype"]
if "sp" in d:
args["state_proof"] = d["sp"]
if "spmsg" in d:
args["state_proof_message"] = d["spmsg"]

return args

def __eq__(self, other):
if not isinstance(other, StateProofTxn):
return False
return (
super(StateProofTxn, self).__eq__(other)
and self.sprf_type == other.sprf_type
and self.sprf == other.sprf
and self.sprfmsg == other.sprfmsg
)

return False


def write_to_file(txns, path, overwrite=True):
"""
Write signed or unsigned transactions to a file.
Expand Down
36 changes: 34 additions & 2 deletions algosdk/v2client/algod.py
Original file line number Diff line number Diff line change
Expand Up @@ -397,15 +397,47 @@ def genesis(self, **kwargs):
req = "/genesis"
return self.algod_request("GET", req, **kwargs)

def proof(self, round_num, txid, **kwargs):
def transaction_proof(
self, round_num, txid, hashtype="", response_format="json", **kwargs
):
"""
Get the proof for a given transaction in a round.
Get a proof for a transaction in a block.
Args:
round_num (int): The round in which the transaction appears.
txid (str): The transaction ID for which to generate a proof.
hashtype (str): The type of hash function used to create the proof, must be either sha512_256 or sha256.
"""
params = {"format": response_format}
if hashtype != "":
params["hashtype"] = hashtype
req = "/blocks/{}/transactions/{}/proof".format(round_num, txid)
return self.algod_request(
"GET",
req,
params=params,
response_format=response_format,
**kwargs
)

def lightblockheader_proof(self, round_num, **kwargs):
"""
Gets a proof for a given light block header inside a state proof commitment.
Args:
round_num (int): The round to which the light block header belongs.
"""
req = "/blocks/{}/lightheader/proof".format(round_num)
return self.algod_request("GET", req, **kwargs)

def stateproofs(self, round_num, **kwargs):
"""
Get a state proof that covers a given round
Args:
round_num (int): The round for which a state proof is desired.
"""
req = "/stateproofs/{}".format(round_num)
return self.algod_request("GET", req, **kwargs)


Expand Down
19 changes: 19 additions & 0 deletions tests/steps/other_v2_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -1373,3 +1373,22 @@ def check_mapping_equal(context, sourcemap):
assert (
context.raw_source_map == expected
), f"context.raw_source_map={nl}{context.raw_source_map}{nl}expected={nl}{expected}"


@when("we make a GetLightBlockHeaderProof call for round {round}")
def lightblock(context, round):
context.response = context.acl.lightblockheader_proof(round)


@when("we make a GetStateProof call for round {round}")
def state_proofs(context, round):
context.response = context.acl.stateproofs(round)


@when(
'we make a GetTransactionProof call for round {round} txid "{txid}" and hashtype "{hashtype:MaybeString}"'
)
def transaction_proof(context, round, txid, hashtype):
context.response = context.acl.transaction_proof(
round, txid, hashtype, "msgpack"
)
11 changes: 11 additions & 0 deletions tests/steps/steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,17 @@
wallet,
)
from algosdk.future import transaction
from algosdk import encoding
from algosdk import algod
from algosdk import account
from algosdk import mnemonic
from algosdk import wallet
from algosdk import auction
from algosdk import util
from algosdk import logic
import os
from datetime import datetime

from behave import given, then, when
from nacl.signing import SigningKey

Expand Down
4 changes: 3 additions & 1 deletion tests/unit.tags
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@
@unit.tealsign
@unit.transactions
@unit.transactions.keyreg
@unit.transactions.payment
@unit.transactions.payment
@unit.stateproof.paths
@unit.stateproof.responses
164 changes: 164 additions & 0 deletions tests/unit_tests/test_other.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,170 @@ def test_keyreg_txn_nonpart(self):
encoding.msgpack_encode(encoding.future_msgpack_decode(keyregtxn)),
)

def test_stateproof_txn(self):
stateprooftxn = (
"gqNzaWfEQHsgfEAmEHUxLLLR9s+Y/yq5WeoGo/jAArCbany+7ZYwExMySzAhmV7M7S8"
"+LBtJalB4EhzEUMKmt3kNKk6+vAWjdHhuh6Jmds0CaaJnaMQgSGO1GKSzyE7IEPItTx"
"CByw9x8FmnrCDexi9/cOUJOiKibHbNBlGjc25kxCC7PFJiqdXHTSAn46fq5Nb/cM9sT"
"OTF4FfBHtOblTRCBaJzcIahUIKjaHNogaF0AaJ0ZAGhU4KjaHNogaF0AaJ0ZAGhY8RA"
"dWo+1yk/97WVvXRuLLyywild8Xe6PxjtmuB/lShfdOXs0Au7Q67KkT5LzC88hX5fFvj"
"Bx/AqKREhoEd14JiTt6JwctwAlAAAAAAAAAAAAQAAAAABAQAAAAAAAAAAAAAAAQAAAA"
"AAAAEAAAAAAAAAAAAAAQAAAAABAAABAQEAAAAAAAABAAEAAAAAAAEAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEBAAABAAAAAAAAAAEAAAAAAQAAAAABAAAA"
"AAAAAAEAAAAAAAAAAQAAAAChcoKhMIKhcIKhcIKjY210xECJ3vxgEUPuCXmKeJQmasV"
"fhmraJZoVu+p8MTJc6EzU4PGZWuxd6DU80//HXDfVCImipmSQhSwkNEmea+Pg0lMwom"
"xmzQEAoXfPAA41/zsxyAChc4Ghc4SjaWR4AqNwcmaDo2hzaIGhdAGjcHRolNlYeEFKc"
"TJhL1ZITzA0NG1iYjBmZlZpeDE4dk5jYUdZNDFWbDh0VytIVDEzcEJmcDlTdjVWaitz"
"SHFSTUs5OW9GNU53SWlFM2ljRGRoNlhZL2d1eHRNdXc9PdlYZkVRTzFvSmpBNXZiSmZ"
"MT2JIQlNNQ3pqYkNDODZ1aVlJNUNDdW9yaDdFNEJlRTlSZFVjYmRqVkE1VWFDOHIzan"
"padjlseU95UmVVdjZVQUluN283cWc9PdlYNTNnZDBuM09LVU9yYXJNcG1SdnJ5UE8wc"
"Vpqb3V5c1BPVHVuQ2NTUnZRdG1BR1N6dllDWUZqYmxGZXZ0c3JQVUtYbnI0cGFWZXcy"
"V21Hb2tZSFVXOVE9PdlYZUZtME5iQlpaYlp0NzliS3JhblU5UUFCUnFldVhoOEk4Ry9"
"qNkZ6NmJsRE1NQmwvWkpMSFNMUEVpVmU0UkQzVkp6d1Y4Nyt4NHl1NGEzdDZnQW5rcl"
"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"
"2IEfp8R5UliCvt3pEQyD5vXZthr89CNAiQElwMdCAA8iULb+8KoXBVriAFdm7M+HiLg"
"7TZJbsZFoN1XerqvoyTOmIT0vKUcYLuMOOBzAUd4oGENxzWDhV1eO4sTzvaD9tEFO9c"
"6k/Bx82BAC6HlBRVXLXJOxMPpNmqCpxKrE18bBAc9dfjkkS80rtJkBJ0opIzQx8YEoH"
"QQcxstQa5L1UUbYGmpnqIGZY9XKwC4mYFBEtJxIM0RE8y2Ra0FJcIMeHQ8pJpjybW69"
"XfIY+gBjona956scDOp10u/wPytquIjvOwFUM47Gm5cqS0QwUWMz1d/WCVwF627hlbw"
"QDKis6EG54MnJlA/oOrCxEGiBZpusf7LB2vUWzd2nd23ZFzp6U4oQR7D0AKllo7tQgk"
"pDVe0jgbp3CjJCX6T4CcFGX3tv0BvhtKp7Qk7gaScuZaExgqFwgqFwgqNjbXTEQNkzH"
"iRX8wGA8aHIiiQS5KYeZps0Ek70Cb5dfULAvUKx/Zlienia5CW4EaV3JTD06XCsQKpw"
"hgbahcYTgjzNVg+ibGbNAQChd88AA41/zsxyAKFzgqFszwAONf87McgAoXOEo2lkeAK"
"jcHJmg6Noc2iBoXQBo3B0aJTZWDFIZ3d6d0VibUxCdEU2RGx3RVZwd0hyTTNhMEY1UW"
"13aVFNdklqTndrdHJleXJwNW5Cc0xCcGlsSTJ3OW5DWERYVDlobW1SNFFRNG9Fcm51Z"
"XN5S2lRPT3ZWERmTW91R0dkNUZUNlFJZkE5cXF6ci9vNDBRYWNzc25vdGh0RncvUHo4"
"MHFRQ3QxUG1nNWFCZjZOcnhaLzRMaEtSb1I1Q2hQQitPVW5nOGNtZGRZQnVnPT3ZWDV"
"UMEk2UDBHSHY5cm1vTlVteC9jMXllY3QwMlFvR3UxLy9sSFYyZEhxTHVEaXFmeTVrak"
"1VU2xBR1Q1YSs3bzdiZzhDYk5VMnlpUmVIMjhRNnZQcWNBPT3ZWGhYT05jQVZ0cHpCe"
"DR0dHE4ZVJOWUhkNy9TcmEzSEJQd01HR1hXcnNSNEtxVTdtRkk5UURpSEU2MDlMd0RE"
"Nk1DYktXNWt2VnJsSVlzRWgvRWxMcERnPT2idGQEo3NpZ8UEzroApUZQwaeHxrhrTqd"
"7aJVAazbex5N6mFD56ayeJPkqFA2BUMwvda3qNqG4vs+3pQ7KuWR2MtDCvYMS7cio1v"
"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"
"c3RwZg=="
)

self.assertEqual(
stateprooftxn,
encoding.msgpack_encode(
encoding.future_msgpack_decode(stateprooftxn)
),
)

def test_asset_create(self):
golden = (
"gqNzaWfEQEDd1OMRoQI/rzNlU4iiF50XQXmup3k5czI9hEsNqHT7K4KsfmA/0DUVk"
Expand Down

0 comments on commit 08efd34

Please sign in to comment.