| 852 | */ |
| 853 | template <typename F> |
| 854 | std::optional<Node> GenNode(MsCtx script_ctx, F ConsumeNode, Type root_type, bool strict_valid = false) |
| 855 | { |
| 856 | /** A stack of miniscript Nodes being built up. */ |
| 857 | std::vector<Node> stack; |
| 858 | /** The queue of instructions. */ |
| 859 | std::vector<std::pair<Type, std::optional<NodeInfo>>> todo{{root_type, {}}}; |
| 860 | /** Predict the number of (static) script ops. */ |
| 861 | uint32_t ops{0}; |
| 862 | /** Predict the total script size (every unexplored subnode is counted as one, as every leaf is |
| 863 | * at least one script byte). */ |
| 864 | uint32_t scriptsize{1}; |
| 865 | |
| 866 | while (!todo.empty()) { |
| 867 | // The expected type we have to construct. |
| 868 | auto type_needed = todo.back().first; |
| 869 | if (!todo.back().second) { |
| 870 | // Fragment/children have not been decided yet. Decide them. |
| 871 | auto node_info = ConsumeNode(type_needed); |
| 872 | if (!node_info) return {}; |
| 873 | // Update predicted resource limits. Since every leaf Miniscript node is at least one |
| 874 | // byte long, we move one byte from each child to their parent. A similar technique is |
| 875 | // used in the miniscript::internal::Parse function to prevent runaway string parsing. |
| 876 | scriptsize += miniscript::internal::ComputeScriptLen(node_info->fragment, ""_mst, node_info->subtypes.size(), node_info->k, node_info->subtypes.size(), |
| 877 | node_info->keys.size(), script_ctx) - 1; |
| 878 | if (scriptsize > MAX_STANDARD_P2WSH_SCRIPT_SIZE) return {}; |
| 879 | switch (node_info->fragment) { |
| 880 | case Fragment::JUST_0: |
| 881 | case Fragment::JUST_1: |
| 882 | break; |
| 883 | case Fragment::PK_K: |
| 884 | break; |
| 885 | case Fragment::PK_H: |
| 886 | ops += 3; |
| 887 | break; |
| 888 | case Fragment::OLDER: |
| 889 | case Fragment::AFTER: |
| 890 | ops += 1; |
| 891 | break; |
| 892 | case Fragment::RIPEMD160: |
| 893 | case Fragment::SHA256: |
| 894 | case Fragment::HASH160: |
| 895 | case Fragment::HASH256: |
| 896 | ops += 4; |
| 897 | break; |
| 898 | case Fragment::ANDOR: |
| 899 | ops += 3; |
| 900 | break; |
| 901 | case Fragment::AND_V: |
| 902 | break; |
| 903 | case Fragment::AND_B: |
| 904 | case Fragment::OR_B: |
| 905 | ops += 1; |
| 906 | break; |
| 907 | case Fragment::OR_C: |
| 908 | ops += 2; |
| 909 | break; |
| 910 | case Fragment::OR_D: |
| 911 | ops += 3; |
no test coverage detected