MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / GenNode

Function GenNode

src/test/fuzz/miniscript.cpp:854–1007  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

852 */
853template <typename F>
854std::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;

Callers 1

miniscript.cppFile · 0.85

Calls 15

ConsumeNodeFunction · 0.85
ComputeScriptLenFunction · 0.85
IsTapscriptFunction · 0.85
MaxScriptSizeFunction · 0.85
rbeginMethod · 0.80
FragmentMethod · 0.80
GetStaticOpsMethod · 0.80
DuplicateKeyCheckMethod · 0.80
emptyMethod · 0.45
backMethod · 0.45
sizeMethod · 0.45
reserveMethod · 0.45

Tested by

no test coverage detected