mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2024-09-21 00:24:37 +03:00
Optimize state layer and add tests
This commit is contained in:
parent
bb8c2cf827
commit
3ee52a4717
@ -3,8 +3,7 @@
|
||||
METADATA
|
||||
METADATA_UPDATER_PUZZLE_HASH
|
||||
INNER_PUZZLE
|
||||
solution
|
||||
my_amount
|
||||
inner_solution
|
||||
)
|
||||
|
||||
(include condition_codes.clvm)
|
||||
@ -28,62 +27,53 @@
|
||||
)
|
||||
|
||||
|
||||
; this function does two thins - it wraps the odd value create coins, and it also filters out all negative conditions
|
||||
(defun wrap_odd_create_coins (NFT_STATE_LAYER_MOD_HASH ((METADATA METADATA_UPDATER_PUZZLE_HASH) conditions) my_amount)
|
||||
; this function does two things - it wraps the odd value create coins, and it also filters out all negative conditions
|
||||
; odd_coin_params is (puzhash amount ...)
|
||||
; new_metadata_info is ((METADATA METADATA_UPDATER_PUZZLE_HASH) conditions)
|
||||
(defun wrap_odd_create_coins (NFT_STATE_LAYER_MOD_HASH conditions odd_coin_params new_metadata_info metadata_seen)
|
||||
(if conditions
|
||||
(if (= (f (f conditions)) CREATE_COIN)
|
||||
(if (logand (f (r (r (f conditions)))) ONE)
|
||||
(c (c CREATE_COIN (c (nft_state_layer_puzzle_hash NFT_STATE_LAYER_MOD_HASH METADATA METADATA_UPDATER_PUZZLE_HASH (f (r (f conditions)))) (c my_amount (r (r (r (f conditions))))))) (wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (list (list METADATA METADATA_UPDATER_PUZZLE_HASH) (r conditions)) my_amount))
|
||||
(c (f conditions) (wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (list (list METADATA METADATA_UPDATER_PUZZLE_HASH) (r conditions)) my_amount))
|
||||
)
|
||||
(if (> (f (f conditions)) 0)
|
||||
(c (f conditions) (wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (list (list METADATA METADATA_UPDATER_PUZZLE_HASH) (r conditions)) my_amount))
|
||||
(wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (list (list METADATA METADATA_UPDATER_PUZZLE_HASH) (r conditions)) my_amount)
|
||||
)
|
||||
(if (logand (f (r (r (f conditions)))) ONE)
|
||||
(wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (r conditions) (r (f conditions)) new_metadata_info metadata_seen)
|
||||
(c (f conditions) (wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (r conditions) odd_coin_params new_metadata_info metadata_seen))
|
||||
)
|
||||
(if (= (f (f conditions)) -24)
|
||||
(wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (r conditions) odd_coin_params
|
||||
(if (all
|
||||
(= (sha256tree1 (f (r (f conditions)))) (f (r (f new_metadata_info))))
|
||||
(= metadata_seen ())
|
||||
)
|
||||
(a (f (r (f conditions))) (list (f (f new_metadata_info)) (f (r (f new_metadata_info))) (f (r (r (f conditions))))))
|
||||
(x)
|
||||
)
|
||||
1 ; the metadata update has been seen now
|
||||
)
|
||||
(c (f conditions) (wrap_odd_create_coins NFT_STATE_LAYER_MOD_HASH (r conditions) odd_coin_params new_metadata_info metadata_seen))
|
||||
)
|
||||
)
|
||||
()
|
||||
)
|
||||
)
|
||||
|
||||
; take two lists and merge them into one
|
||||
(defun merge_list (list_a list_b)
|
||||
(if list_a
|
||||
(c (f list_a) (merge_list (r list_a) list_b))
|
||||
list_b
|
||||
)
|
||||
)
|
||||
|
||||
(defun check_for_metadata_prog_reveal (METADATA_UPDATER_PUZZLE_HASH CURRENT_METADATA conditions_loop)
|
||||
(if conditions_loop
|
||||
(if (= (f (f conditions_loop)) -24)
|
||||
(if (= (sha256tree1 (f (r (f conditions_loop)))) METADATA_UPDATER_PUZZLE_HASH)
|
||||
(a (f (r (f conditions_loop))) (list CURRENT_METADATA METADATA_UPDATER_PUZZLE_HASH (f (r (r (f conditions_loop))))))
|
||||
(x)
|
||||
(c
|
||||
(c CREATE_COIN
|
||||
(c
|
||||
(nft_state_layer_puzzle_hash
|
||||
NFT_STATE_LAYER_MOD_HASH
|
||||
(f (f new_metadata_info))
|
||||
(f (r (f new_metadata_info)))
|
||||
(f odd_coin_params) ; metadata updater solution
|
||||
)
|
||||
(r odd_coin_params)
|
||||
)
|
||||
)
|
||||
(check_for_metadata_prog_reveal METADATA_UPDATER_PUZZLE_HASH CURRENT_METADATA (r conditions_loop))
|
||||
(f (r new_metadata_info)) ; metadata_updater conditions
|
||||
)
|
||||
(list (list CURRENT_METADATA METADATA_UPDATER_PUZZLE_HASH) 0)
|
||||
)
|
||||
)
|
||||
|
||||
(defun process_metadata_updater (metadata_result conditions)
|
||||
(c (f metadata_result) (list (merge_list (f (r metadata_result)) conditions)))
|
||||
)
|
||||
|
||||
(defun metadata_updater_loader (METADATA_UPDATER_PUZZLE_HASH CURRENT_METADATA conditions)
|
||||
(process_metadata_updater (check_for_metadata_prog_reveal METADATA_UPDATER_PUZZLE_HASH CURRENT_METADATA conditions) conditions)
|
||||
)
|
||||
|
||||
; main
|
||||
(c
|
||||
(list ASSERT_MY_AMOUNT my_amount)
|
||||
(wrap_odd_create_coins
|
||||
NFT_STATE_LAYER_MOD_HASH
|
||||
(metadata_updater_loader
|
||||
METADATA_UPDATER_PUZZLE_HASH METADATA (a INNER_PUZZLE solution)
|
||||
)
|
||||
my_amount
|
||||
0
|
||||
)
|
||||
(wrap_odd_create_coins
|
||||
NFT_STATE_LAYER_MOD_HASH
|
||||
(a INNER_PUZZLE inner_solution)
|
||||
()
|
||||
(list (list METADATA METADATA_UPDATER_PUZZLE_HASH) 0) ; if the magic condition is never seen, this is the information we us to recurry
|
||||
()
|
||||
)
|
||||
)
|
||||
|
@ -1 +1 @@
|
||||
ff02ffff01ff04ffff04ff10ffff04ff81bfff808080ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff3affff04ff02ffff04ff17ffff04ff0bffff04ffff02ff2fff5f80ff808080808080ffff04ff81bfffff01ff8080808080808080ffff04ffff01ffffff49ff0233ffff0401ff0102ffffffff02ffff03ff05ffff01ff02ff22ffff04ff02ffff04ff0dffff04ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff17ffff01ff02ffff03ffff09ff47ffff0181e880ffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff81a7ff80808080ff0580ffff01ff02ff81a7ffff04ff0bffff04ff05ffff04ff820167ff8080808080ffff01ff088080ff0180ffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff37ff80808080808080ff0180ffff01ff04ffff04ff0bffff04ff05ff808080ffff01ff80808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff2affff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff02ff26ffff04ff02ffff04ffff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ff808080808080ffff04ff17ff8080808080ffffff04ff09ffff04ffff02ff2affff04ff02ffff04ff15ffff04ff0bff8080808080ff808080ff0bff3cffff0bff34ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02ff22ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff2bffff01ff02ffff03ffff09ff818bff3880ffff01ff02ffff03ffff18ff8202cbff3480ffff01ff04ffff04ff38ffff04ffff02ff36ffff04ff02ffff04ff05ffff04ff82014bffff04ffff0bff34ff5380ffff04ffff02ff2effff04ff02ffff04ff23ff80808080ffff04ffff0bff34ff0580ff8080808080808080ffff04ff17ff8203cb808080ffff02ff3effff04ff02ffff04ff05ffff04ffff04ffff04ff23ffff04ff53ff808080ffff04ff6bff808080ffff04ff17ff80808080808080ffff01ff04ff4bffff02ff3effff04ff02ffff04ff05ffff04ffff04ffff04ff23ffff04ff53ff808080ffff04ff6bff808080ffff04ff17ff8080808080808080ff0180ffff01ff02ffff03ffff15ff818bff8080ffff01ff04ff4bffff02ff3effff04ff02ffff04ff05ffff04ffff04ffff04ff23ffff04ff53ff808080ffff04ff6bff808080ffff04ff17ff80808080808080ffff01ff02ff3effff04ff02ffff04ff05ffff04ffff04ffff04ff23ffff04ff53ff808080ffff04ff6bff808080ffff04ff17ff80808080808080ff018080ff0180ff8080ff0180ff018080
|
||||
ff02ffff01ff02ff3effff04ff02ffff04ff05ffff04ffff02ff2fff5f80ffff04ff80ffff04ffff04ffff04ff0bffff04ff17ff808080ffff01ff808080ffff01ff8080808080808080ffff04ffff01ffffff0233ff04ff0101ffff02ff02ffff03ff05ffff01ff02ff1affff04ff02ffff04ff0dffff04ffff0bff12ffff0bff2cff1480ffff0bff12ffff0bff12ffff0bff2cff3c80ff0980ffff0bff12ff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff0bff12ffff0bff2cff1080ffff0bff12ffff0bff12ffff0bff2cff3c80ff0580ffff0bff12ffff02ff1affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff0bffff01ff02ffff03ffff09ff23ff1880ffff01ff02ffff03ffff18ff81b3ff2c80ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff33ffff04ff2fffff04ff5fff8080808080808080ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff0180ffff01ff02ffff03ffff09ff23ffff0181e880ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ffff02ffff03ffff22ffff09ffff02ff2effff04ff02ffff04ff53ff80808080ff82014f80ffff09ff5fff808080ffff01ff02ff53ffff04ff818fffff04ff82014fffff04ff81b3ff8080808080ffff01ff088080ff0180ffff01ff0180808080808080ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff018080ff0180ffff01ff04ffff04ff18ffff04ffff02ff16ffff04ff02ffff04ff05ffff04ff27ffff04ffff0bff2cff82014f80ffff04ffff02ff2effff04ff02ffff04ff818fff80808080ffff04ffff0bff2cff0580ff8080808080808080ff378080ff81af8080ff0180ff018080
|
129
tests/wallet/nft_wallet/test_nft_lifecycle.py
Normal file
129
tests/wallet/nft_wallet/test_nft_lifecycle.py
Normal file
@ -0,0 +1,129 @@
|
||||
import pytest
|
||||
|
||||
from blspy import G2Element
|
||||
from typing import List, Tuple
|
||||
|
||||
from chia.clvm.spend_sim import SpendSim, SimClient
|
||||
from chia.types.blockchain_format.program import Program
|
||||
from chia.types.blockchain_format.sized_bytes import bytes32
|
||||
from chia.types.coin_spend import CoinSpend
|
||||
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
||||
from chia.types.spend_bundle import SpendBundle
|
||||
from chia.wallet.nft_wallet.nft_puzzles import (
|
||||
create_nft_layer_puzzle_with_curry_params,
|
||||
metadata_to_program,
|
||||
NFT_METADATA_UPDATER,
|
||||
)
|
||||
|
||||
ACS = Program.to(1)
|
||||
ACS_PH = ACS.get_tree_hash()
|
||||
|
||||
|
||||
@pytest.mark.asyncio()
|
||||
@pytest.mark.parametrize("metadata_updater", ["default"])
|
||||
async def test_state_layer(setup_sim: Tuple[SpendSim, SimClient], metadata_updater: str) -> None:
|
||||
sim, sim_client = setup_sim
|
||||
|
||||
try:
|
||||
if metadata_updater == "default":
|
||||
METADATA: Program = metadata_to_program(
|
||||
{
|
||||
b"u": ["hey hey"],
|
||||
b"lu": ["You have no permissions grr"],
|
||||
b"mu": ["This but off chain"],
|
||||
b"foo": ["Can't update this"],
|
||||
}
|
||||
)
|
||||
METADATA_UPDATER: Program = NFT_METADATA_UPDATER
|
||||
else:
|
||||
# TODO: Add test for updateable
|
||||
return
|
||||
METADATA_UPDATER_PUZZLE_HASH: bytes32 = METADATA_UPDATER.get_tree_hash()
|
||||
|
||||
state_layer_puzzle: Program = create_nft_layer_puzzle_with_curry_params(
|
||||
METADATA, METADATA_UPDATER_PUZZLE_HASH, ACS
|
||||
)
|
||||
state_layer_ph: bytes32 = state_layer_puzzle.get_tree_hash()
|
||||
await sim.farm_block(state_layer_ph)
|
||||
state_layer_coin = (
|
||||
await sim_client.get_coin_records_by_puzzle_hash(state_layer_ph, include_spent_coins=False)
|
||||
)[0].coin
|
||||
|
||||
generic_spend = CoinSpend(
|
||||
state_layer_coin,
|
||||
state_layer_puzzle,
|
||||
Program.to([[[51, ACS_PH, 1]]]),
|
||||
)
|
||||
generic_bundle = SpendBundle([generic_spend], G2Element())
|
||||
|
||||
result = await sim_client.push_tx(generic_bundle)
|
||||
assert result == (MempoolInclusionStatus.SUCCESS, None)
|
||||
await sim.farm_block()
|
||||
|
||||
if metadata_updater == "default":
|
||||
metadata_updater_solutions: List[Program] = [
|
||||
Program.to((b"u", "update")),
|
||||
Program.to((b"lu", "update")),
|
||||
Program.to((b"mu", "update")),
|
||||
Program.to((b"foo", "update")),
|
||||
]
|
||||
expected_metadatas: List[Program] = [
|
||||
metadata_to_program(
|
||||
{
|
||||
b"u": ["update", "hey hey"],
|
||||
b"lu": ["You have no permissions grr"],
|
||||
b"mu": ["This but off chain"],
|
||||
b"foo": ["Can't update this"],
|
||||
}
|
||||
),
|
||||
metadata_to_program(
|
||||
{
|
||||
b"u": ["update", "hey hey"],
|
||||
b"lu": ["update", "You have no permissions grr"],
|
||||
b"mu": ["This but off chain"],
|
||||
b"foo": ["Can't update this"],
|
||||
}
|
||||
),
|
||||
metadata_to_program(
|
||||
{
|
||||
b"u": ["update", "hey hey"],
|
||||
b"lu": ["update", "You have no permissions grr"],
|
||||
b"mu": ["update", "This but off chain"],
|
||||
b"foo": ["Can't update this"],
|
||||
}
|
||||
),
|
||||
metadata_to_program(
|
||||
{ # no change
|
||||
b"u": ["update", "hey hey"],
|
||||
b"lu": ["update", "You have no permissions grr"],
|
||||
b"mu": ["update", "This but off chain"],
|
||||
b"foo": ["Can't update this"],
|
||||
}
|
||||
),
|
||||
]
|
||||
else:
|
||||
return
|
||||
|
||||
for solution, metadata in zip(metadata_updater_solutions, expected_metadatas):
|
||||
state_layer_coin = (
|
||||
await sim_client.get_coin_records_by_parent_ids([state_layer_coin.name()], include_spent_coins=False)
|
||||
)[0].coin
|
||||
update_spend = CoinSpend(
|
||||
state_layer_coin,
|
||||
state_layer_puzzle,
|
||||
Program.to(
|
||||
[
|
||||
[
|
||||
[51, ACS_PH, 1],
|
||||
[-24, METADATA_UPDATER, solution],
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
update_bundle = SpendBundle([update_spend], G2Element())
|
||||
result = await sim_client.push_tx(update_bundle)
|
||||
assert result == (MempoolInclusionStatus.SUCCESS, None)
|
||||
await sim.farm_block()
|
||||
state_layer_puzzle = create_nft_layer_puzzle_with_curry_params(metadata, METADATA_UPDATER_PUZZLE_HASH, ACS)
|
||||
finally:
|
||||
await sim.close() # type: ignore
|
Loading…
Reference in New Issue
Block a user