mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2024-12-01 20:05:43 +03:00
Use Program
instead of src.util.clvm
.
This commit is contained in:
parent
092932105c
commit
aefed27f79
@ -7,7 +7,7 @@ from src.types.coin_record import CoinRecord
|
|||||||
from src.types.name_puzzle_condition import NPC
|
from src.types.name_puzzle_condition import NPC
|
||||||
from src.full_node.mempool import Mempool
|
from src.full_node.mempool import Mempool
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
from src.util.clvm import EvalError, int_from_bytes, run_program
|
from src.util.clvm import int_from_bytes
|
||||||
from src.util.condition_tools import ConditionOpcode, conditions_dict_for_solution
|
from src.util.condition_tools import ConditionOpcode, conditions_dict_for_solution
|
||||||
from src.util.errors import Err
|
from src.util.errors import Err
|
||||||
import time
|
import time
|
||||||
@ -96,9 +96,9 @@ def get_name_puzzle_conditions(
|
|||||||
"""
|
"""
|
||||||
cost_sum = 0
|
cost_sum = 0
|
||||||
try:
|
try:
|
||||||
cost_run, sexp = run_program(block_program, [])
|
cost_run, sexp = block_program.run_with_cost([])
|
||||||
cost_sum += cost_run
|
cost_sum += cost_run
|
||||||
except EvalError:
|
except Program.EvalError:
|
||||||
return Err.INVALID_COIN_SOLUTION, [], uint64(0)
|
return Err.INVALID_COIN_SOLUTION, [], uint64(0)
|
||||||
|
|
||||||
npc_list = []
|
npc_list = []
|
||||||
@ -121,7 +121,7 @@ def get_name_puzzle_conditions(
|
|||||||
cost_sum += cost_run
|
cost_sum += cost_run
|
||||||
if error:
|
if error:
|
||||||
return error, [], uint64(cost_sum)
|
return error, [], uint64(cost_sum)
|
||||||
except EvalError:
|
except Program.EvalError:
|
||||||
return Err.INVALID_COIN_SOLUTION, [], uint64(cost_sum)
|
return Err.INVALID_COIN_SOLUTION, [], uint64(cost_sum)
|
||||||
if conditions_dict is None:
|
if conditions_dict is None:
|
||||||
conditions_dict = {}
|
conditions_dict = {}
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
import io
|
import io
|
||||||
from typing import Any, List, Set
|
from typing import Any, List, Optional, Set, Tuple
|
||||||
|
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
from src.util.clvm import run_program, sexp_from_stream, sexp_to_stream
|
from src.util.clvm import run_program, sexp_from_stream, sexp_to_stream
|
||||||
from clvm import SExp
|
|
||||||
from src.util.hash import std_hash
|
from src.util.hash import std_hash
|
||||||
|
|
||||||
from clvm_tools.curry import curry
|
from clvm import SExp
|
||||||
|
from clvm.EvalError import EvalError
|
||||||
|
from clvm.casts import int_from_bytes
|
||||||
|
from clvm_tools.curry import curry, uncurry
|
||||||
|
|
||||||
|
|
||||||
class Program(SExp): # type: ignore # noqa
|
class Program(SExp):
|
||||||
"""
|
"""
|
||||||
A thin wrapper around s-expression data intended to be invoked with "eval".
|
A thin wrapper around s-expression data intended to be invoked with "eval".
|
||||||
"""
|
"""
|
||||||
@ -61,14 +63,25 @@ class Program(SExp): # type: ignore # noqa
|
|||||||
"""
|
"""
|
||||||
return self._tree_hash(set(args))
|
return self._tree_hash(set(args))
|
||||||
|
|
||||||
def run(self, args) -> "Program":
|
def run_with_cost(self, args) -> Tuple[int, "Program"]:
|
||||||
prog_args = Program.to(args)
|
prog_args = Program.to(args)
|
||||||
cost, r = run_program(self, prog_args)
|
return run_program(self, prog_args)
|
||||||
|
|
||||||
|
def run(self, args) -> "Program":
|
||||||
|
cost, r = self.run_with_cost(args)
|
||||||
return Program.to(r)
|
return Program.to(r)
|
||||||
|
|
||||||
def curry(self, *args) -> "Program":
|
def curry(self, *args) -> "Program":
|
||||||
cost, r = curry(self, list(args))
|
cost, r = curry(self, list(args))
|
||||||
return Program.to(r)
|
return Program.to(r)
|
||||||
|
|
||||||
|
def uncurry(self) -> Optional[Tuple["Program", "Program"]]:
|
||||||
|
return uncurry(self)
|
||||||
|
|
||||||
|
def as_int(self) -> int:
|
||||||
|
return int_from_bytes(self.as_atom())
|
||||||
|
|
||||||
def __deepcopy__(self, memo):
|
def __deepcopy__(self, memo):
|
||||||
return type(self).from_bytes(bytes(self))
|
return type(self).from_bytes(bytes(self))
|
||||||
|
|
||||||
|
EvalError = EvalError
|
||||||
|
@ -7,7 +7,7 @@ from src.types.condition_opcodes import ConditionOpcode
|
|||||||
from src.types.coin import Coin
|
from src.types.coin import Coin
|
||||||
from src.types.program import Program
|
from src.types.program import Program
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
from src.util.clvm import EvalError, int_from_bytes, run_program
|
from src.util.clvm import int_from_bytes
|
||||||
from src.util.ints import uint64
|
from src.util.ints import uint64
|
||||||
from src.util.errors import Err, ConsensusError
|
from src.util.errors import Err, ConsensusError
|
||||||
|
|
||||||
@ -121,15 +121,15 @@ def conditions_dict_for_solution(
|
|||||||
|
|
||||||
|
|
||||||
def conditions_for_solution(
|
def conditions_for_solution(
|
||||||
solution_program, run_program=run_program
|
solution_program,
|
||||||
) -> Tuple[Optional[Err], Optional[List[ConditionVarPair]], uint64]:
|
) -> Tuple[Optional[Err], Optional[List[ConditionVarPair]], uint64]:
|
||||||
# get the standard script for a puzzle hash and feed in the solution
|
# get the standard script for a puzzle hash and feed in the solution
|
||||||
args = Program.to(solution_program)
|
args = Program.to(solution_program)
|
||||||
try:
|
try:
|
||||||
puzzle_sexp = args.first()
|
puzzle_sexp = args.first()
|
||||||
solution_sexp = args.rest().first()
|
solution_sexp = args.rest().first()
|
||||||
cost, r = run_program(puzzle_sexp, solution_sexp)
|
cost, r = puzzle_sexp.run_with_cost(solution_sexp)
|
||||||
error, result = parse_sexp_to_conditions(r)
|
error, result = parse_sexp_to_conditions(r)
|
||||||
return error, result, cost
|
return error, result, cost
|
||||||
except EvalError:
|
except Program.EvalError:
|
||||||
return Err.SEXP_ERROR, None, uint64(0)
|
return Err.SEXP_ERROR, None, uint64(0)
|
||||||
|
@ -224,7 +224,7 @@ def uncurry_cc(puzzle: Program) -> Optional[Tuple[Program, Program, Program]]:
|
|||||||
Take a puzzle and return `None` if it's not a `CC_MOD` cc, or
|
Take a puzzle and return `None` if it's not a `CC_MOD` cc, or
|
||||||
a triple of `mod_hash, genesis_coin_checker, inner_puzzle` if it is.
|
a triple of `mod_hash, genesis_coin_checker, inner_puzzle` if it is.
|
||||||
"""
|
"""
|
||||||
r = uncurry(puzzle)
|
r = puzzle.uncurry()
|
||||||
if r is None:
|
if r is None:
|
||||||
return r
|
return r
|
||||||
inner_f, args = r
|
inner_f, args = r
|
||||||
|
@ -11,7 +11,6 @@ from src.types.program import Program
|
|||||||
from src.types.spend_bundle import SpendBundle
|
from src.types.spend_bundle import SpendBundle
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
from src.util.byte_types import hexstr_to_bytes
|
from src.util.byte_types import hexstr_to_bytes
|
||||||
from src.util.clvm import EvalError, run_program
|
|
||||||
from src.util.condition_tools import (
|
from src.util.condition_tools import (
|
||||||
conditions_dict_for_solution,
|
conditions_dict_for_solution,
|
||||||
pkm_pairs_for_conditions_dict,
|
pkm_pairs_for_conditions_dict,
|
||||||
@ -296,9 +295,9 @@ class CCWallet:
|
|||||||
"""
|
"""
|
||||||
cost_sum = 0
|
cost_sum = 0
|
||||||
try:
|
try:
|
||||||
cost_run, sexp = run_program(block_program, [])
|
cost_run, sexp = block_program.run_with_cost([])
|
||||||
cost_sum += cost_run
|
cost_sum += cost_run
|
||||||
except EvalError:
|
except Program.EvalError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
for name_solution in sexp.as_iter():
|
for name_solution in sexp.as_iter():
|
||||||
@ -319,7 +318,7 @@ class CCWallet:
|
|||||||
cost_sum += cost_run
|
cost_sum += cost_run
|
||||||
if error:
|
if error:
|
||||||
return False
|
return False
|
||||||
except EvalError:
|
except Program.EvalError:
|
||||||
|
|
||||||
return False
|
return False
|
||||||
if conditions_dict is None:
|
if conditions_dict is None:
|
||||||
|
@ -4,8 +4,6 @@ from clvm import KEYWORD_FROM_ATOM
|
|||||||
|
|
||||||
from clvm_tools.binutils import disassemble as bu_disassemble
|
from clvm_tools.binutils import disassemble as bu_disassemble
|
||||||
|
|
||||||
from stages.stage_0 import run_program
|
|
||||||
|
|
||||||
from src.types.coin import Coin
|
from src.types.coin import Coin
|
||||||
from src.types.condition_opcodes import ConditionOpcode
|
from src.types.condition_opcodes import ConditionOpcode
|
||||||
from src.types.program import Program
|
from src.types.program import Program
|
||||||
@ -53,7 +51,7 @@ def debug_spend_bundle(spend_bundle: SpendBundle) -> None:
|
|||||||
|
|
||||||
print("=" * 80)
|
print("=" * 80)
|
||||||
for coin_solution in spend_bundle.coin_solutions:
|
for coin_solution in spend_bundle.coin_solutions:
|
||||||
coin, solution_pair = coin_solution.coin, coin_solution.solution
|
coin, solution_pair = coin_solution.coin, Program.to(coin_solution.solution)
|
||||||
puzzle_reveal = solution_pair.first()
|
puzzle_reveal = solution_pair.first()
|
||||||
solution = solution_pair.rest().first()
|
solution = solution_pair.rest().first()
|
||||||
|
|
||||||
@ -70,7 +68,7 @@ def debug_spend_bundle(spend_bundle: SpendBundle) -> None:
|
|||||||
print(f"*** error {error}")
|
print(f"*** error {error}")
|
||||||
else:
|
else:
|
||||||
print()
|
print()
|
||||||
cost, r = run_program(puzzle_reveal, solution)
|
r = puzzle_reveal.run(solution)
|
||||||
print(disassemble(r))
|
print(disassemble(r))
|
||||||
print()
|
print()
|
||||||
if conditions and len(conditions) > 0:
|
if conditions and len(conditions) > 0:
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from clvm_tools.curry import curry as ct_curry, uncurry
|
|
||||||
|
|
||||||
from src.types.coin import Coin
|
from src.types.coin import Coin
|
||||||
from src.types.program import Program
|
from src.types.program import Program
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
@ -11,22 +9,13 @@ from src.wallet.puzzles.load_clvm import load_clvm
|
|||||||
MOD = load_clvm("genesis-by-coin-id-with-0.clvm", package_or_requirement=__name__)
|
MOD = load_clvm("genesis-by-coin-id-with-0.clvm", package_or_requirement=__name__)
|
||||||
|
|
||||||
|
|
||||||
def curry(*args, **kwargs):
|
|
||||||
"""
|
|
||||||
The clvm_tools version of curry returns `cost, program` for now.
|
|
||||||
Eventually it will just return `program`. This placeholder awaits that day.
|
|
||||||
"""
|
|
||||||
cost, prog = ct_curry(*args, **kwargs)
|
|
||||||
return Program.to(prog)
|
|
||||||
|
|
||||||
|
|
||||||
def create_genesis_or_zero_coin_checker(genesis_coin_id: bytes32) -> Program:
|
def create_genesis_or_zero_coin_checker(genesis_coin_id: bytes32) -> Program:
|
||||||
"""
|
"""
|
||||||
Given a specific genesis coin id, create a `genesis_coin_mod` that allows
|
Given a specific genesis coin id, create a `genesis_coin_mod` that allows
|
||||||
both that coin id to issue a cc, or anyone to create a cc with amount 0.
|
both that coin id to issue a cc, or anyone to create a cc with amount 0.
|
||||||
"""
|
"""
|
||||||
genesis_coin_mod = MOD
|
genesis_coin_mod = MOD
|
||||||
return curry(genesis_coin_mod, [genesis_coin_id])
|
return genesis_coin_mod.curry(genesis_coin_id)
|
||||||
|
|
||||||
|
|
||||||
def genesis_coin_id_for_genesis_coin_checker(
|
def genesis_coin_id_for_genesis_coin_checker(
|
||||||
@ -35,7 +24,7 @@ def genesis_coin_id_for_genesis_coin_checker(
|
|||||||
"""
|
"""
|
||||||
Given a `genesis_coin_checker` program, pull out the genesis coin id.
|
Given a `genesis_coin_checker` program, pull out the genesis coin id.
|
||||||
"""
|
"""
|
||||||
r = uncurry(genesis_coin_checker)
|
r = genesis_coin_checker.uncurry()
|
||||||
if r is None:
|
if r is None:
|
||||||
return r
|
return r
|
||||||
f, args = r
|
f, args = r
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from clvm_tools.curry import curry as ct_curry, uncurry
|
|
||||||
|
|
||||||
from src.types.coin import Coin
|
from src.types.coin import Coin
|
||||||
from src.types.program import Program
|
from src.types.program import Program
|
||||||
from src.types.sized_bytes import bytes32
|
from src.types.sized_bytes import bytes32
|
||||||
@ -11,22 +9,13 @@ from src.wallet.puzzles.load_clvm import load_clvm
|
|||||||
MOD = load_clvm("genesis-by-puzzle-hash-with-0.clvm", package_or_requirement=__name__)
|
MOD = load_clvm("genesis-by-puzzle-hash-with-0.clvm", package_or_requirement=__name__)
|
||||||
|
|
||||||
|
|
||||||
def curry(*args, **kwargs):
|
|
||||||
"""
|
|
||||||
The clvm_tools version of curry returns `cost, program` for now.
|
|
||||||
Eventually it will just return `program`. This placeholder awaits that day.
|
|
||||||
"""
|
|
||||||
cost, prog = ct_curry(*args, **kwargs)
|
|
||||||
return Program.to(prog)
|
|
||||||
|
|
||||||
|
|
||||||
def create_genesis_puzzle_or_zero_coin_checker(genesis_puzzle_hash: bytes32) -> Program:
|
def create_genesis_puzzle_or_zero_coin_checker(genesis_puzzle_hash: bytes32) -> Program:
|
||||||
"""
|
"""
|
||||||
Given a specific genesis coin id, create a `genesis_coin_mod` that allows
|
Given a specific genesis coin id, create a `genesis_coin_mod` that allows
|
||||||
both that coin id to issue a cc, or anyone to create a cc with amount 0.
|
both that coin id to issue a cc, or anyone to create a cc with amount 0.
|
||||||
"""
|
"""
|
||||||
genesis_coin_mod = MOD
|
genesis_coin_mod = MOD
|
||||||
return curry(genesis_coin_mod, [genesis_puzzle_hash])
|
return genesis_coin_mod.curry(genesis_puzzle_hash)
|
||||||
|
|
||||||
|
|
||||||
def genesis_puzzle_hash_for_genesis_coin_checker(
|
def genesis_puzzle_hash_for_genesis_coin_checker(
|
||||||
@ -35,7 +24,7 @@ def genesis_puzzle_hash_for_genesis_coin_checker(
|
|||||||
"""
|
"""
|
||||||
Given a `genesis_coin_checker` program, pull out the genesis puzzle hash.
|
Given a `genesis_coin_checker` program, pull out the genesis puzzle hash.
|
||||||
"""
|
"""
|
||||||
r = uncurry(genesis_coin_checker)
|
r = genesis_coin_checker.uncurry()
|
||||||
if r is None:
|
if r is None:
|
||||||
return r
|
return r
|
||||||
f, args = r
|
f, args = r
|
||||||
@ -53,7 +42,6 @@ def lineage_proof_for_zero(parent_coin: Coin) -> Program:
|
|||||||
|
|
||||||
|
|
||||||
def lineage_proof_for_coin(parent_coin: Coin) -> Program:
|
def lineage_proof_for_coin(parent_coin: Coin) -> Program:
|
||||||
breakpoint()
|
|
||||||
if parent_coin.amount == 0:
|
if parent_coin.amount == 0:
|
||||||
return lineage_proof_for_zero(parent_coin)
|
return lineage_proof_for_zero(parent_coin)
|
||||||
return lineage_proof_for_genesis_puzzle(parent_coin)
|
return lineage_proof_for_genesis_puzzle(parent_coin)
|
||||||
|
@ -8,7 +8,6 @@ from src.types.condition_opcodes import ConditionOpcode
|
|||||||
from src.types.condition_var_pair import ConditionVarPair
|
from src.types.condition_var_pair import ConditionVarPair
|
||||||
from src.types.program import Program
|
from src.types.program import Program
|
||||||
from src.wallet.puzzles.p2_delegated_puzzle import puzzle_for_pk
|
from src.wallet.puzzles.p2_delegated_puzzle import puzzle_for_pk
|
||||||
from src.util.clvm import run_program
|
|
||||||
from src.util.wallet_tools import WalletTool
|
from src.util.wallet_tools import WalletTool
|
||||||
from src.util.ints import uint32
|
from src.util.ints import uint32
|
||||||
from src.wallet.derive_keys import master_sk_to_wallet_sk
|
from src.wallet.derive_keys import master_sk_to_wallet_sk
|
||||||
@ -42,7 +41,7 @@ def run_and_return_cost_time(chialisp):
|
|||||||
clvm_loop_solution = f"(1000 {chialisp})"
|
clvm_loop_solution = f"(1000 {chialisp})"
|
||||||
solution_program = Program(binutils.assemble(clvm_loop_solution))
|
solution_program = Program(binutils.assemble(clvm_loop_solution))
|
||||||
|
|
||||||
cost, sexp = run_program(loop_program, solution_program)
|
cost, sexp = loop_program.run_with_cost(solution_program)
|
||||||
|
|
||||||
end = time.time()
|
end = time.time()
|
||||||
total_time = end - start
|
total_time = end - start
|
||||||
@ -156,7 +155,7 @@ if __name__ == "__main__":
|
|||||||
puzzle_start = time.time()
|
puzzle_start = time.time()
|
||||||
clvm_cost = 0
|
clvm_cost = 0
|
||||||
for i in range(0, 1000):
|
for i in range(0, 1000):
|
||||||
cost_run, sexp = run_program(puzzles[i], solutions[i])
|
cost_run, sexp = puzzles[i].run_with_cost(solutions[i])
|
||||||
clvm_cost += cost_run
|
clvm_cost += cost_run
|
||||||
|
|
||||||
puzzle_end = time.time()
|
puzzle_end = time.time()
|
||||||
|
Loading…
Reference in New Issue
Block a user