# Functions
CompressPubKey 获取压缩格式的公钥 参数: - pubKey: 要压缩的ECDSA公钥
返回: - []byte: 压缩后的公钥字节切片
处理逻辑: 1.
DecompressPubKey 从压缩公钥解压得到完整的公钥 参数: - curve: 使用的椭圆曲线 - compressedPubKey: 压缩格式的公钥字节切片
返回: - *ecdsa.PublicKey: 解压后的ECDSA公钥 - error: 解压过程中的错误,如果没有错误则为nil.
DisasmString 将脚本反汇编为一行字符串 参数: - script: 要反汇编的脚本字节切片
返回: - string: 反汇编后的字符串 - error: 解析过程中的错误,如果没有错误则为nil
注意: 此函数仅适用于版本0的脚本.
DisassembleScript 反汇编脚本并以易读的格式返回 参数: - script: 要反汇编的脚本字节切片
返回: - string: 反汇编后的脚本字符串,操作码和数据以空格分隔
处理逻辑: 1.
ExtractPubKeyFromP2PKScriptToECDSA 从P2PK脚本中提取ECDSA公钥 参数: - p2pkScript: P2PK脚本的字节切片
返回: - *ecdsa.PublicKey: 提取的ECDSA公钥 - error: 提取过程中的错误,如果没有错误则为nil.
ExtractPubKeyFromP2PKScriptToRSA 从P2PK脚本中提取RSA公钥 参数: - p2pkScript: P2PK 公钥脚本的字节切片
返回: - *rsa.PublicKey: 提取的RSA公钥 - error: 提取过程中的错误,如果没有错误则为nil
处理逻辑: 1.
ExtractPubKeyHashFromP2PKScript 从 P2PK 脚本中提取公钥哈希 参数: - p2pkScript: P2PK 公钥脚本的字节切片
返回: - []byte: 提取的公钥哈希 - error: 提取过程中的错误,如果没有错误则为nil
处理逻辑: 1.
ExtractPubKeyHashFromScript 从P2PKH脚本中提取公钥哈希 参数: - script: P2PKH 脚本的字节切片
返回: - []byte: 提取的公钥哈希 - error: 提取过程中的错误,如果没有错误则为nil
处理逻辑: 1.
IsPayToPubKeyHash 检查脚本是否为标准的支付公钥哈希(P2PKH)格式 参数: - script: 要检查的脚本字节切片
返回: - bool: 如果是P2PKH格式则返回true,否则返回false.
MakeScriptNum 将传递的序列化字节解释为编码整数,并将结果作为脚本编号返回。
由于共识规则规定解释为 int 的序列化字节只允许在最大字节数确定的范围内,因此在每个操作码的基础上,当提供的字节导致超出范围的数字时,将返回错误 那个范围的。 特别是,绝大多数处理数值的操作码的范围仅限于 4 个字节,因此会将该值传递给此函数,从而产生 [-2^31 + 1, 2^31 - 1] 的允许范围。
如果对编码的额外检查确定它没有用尽可能小的字节数表示或者是负 0 编码 [0x80],则 requireMinimal 标志会导致返回错误。 例如,考虑数字 127。它可以编码为 [0x7f]、[0x7f 0x00]、[0x7f 0x00 0x00 ...] 等。除了 [0x7f] 之外的所有形式都将在启用 requireMinimal 的情况下返回错误。
scriptNumLen 是在返回 ErrStackNumberTooBig 之前编码值可以达到的最大字节数。 这有效地限制了允许值的范围。 警告:如果传递大于 maxScriptNumLen 的值,应格外小心,这可能导致加法和乘法溢出。
有关示例编码,请参阅 Bytes 函数文档。.
MakeScriptTokenizer 返回脚本标记生成器的新实例。 传递不受支持的脚本版本将导致返回的标记生成器立即相应地设置错误。
有关更多详细信息,请参阅 ScriptTokenizer 的文档。.
NewScriptBuilder 返回脚本生成器的新实例。 有关详细信息,请参阅 ScriptBuilder。.
NewSigCache 创建并初始化一个新的 SigCache 实例。 参数 'maxEntries' 表示在任何特定时刻,SigCache中允许存在的最大条目数。 当新条目会导致缓存中的条目数超过最大值时,将随机逐出条目以腾出空间。.
VerifyScriptPubKeyHash 验证脚本中的公钥哈希是否与给定的PubKeyHash匹配 参数: - script: 要验证的脚本字节切片 - pubKeyHash: 要匹配的公钥哈希
返回: - bool: 如果匹配则返回true,否则返回false.
WithScriptAllocSize 指定脚本生成器的支持数组的初始大小。.
# Constants
HashSize 定义了哈希值的大小,通常是双重 SHA256 哈希的大小。.
MaxScriptElementSize 定义可推入堆栈的最大字节数.
MaxScriptSize 是原始脚本允许的最大长度.
将数字0推入栈.
将数字1推入栈.
将数字-1推入栈.
验证交易签名.
将接下来的1个字节作为数据推入栈.
将接下来的10个字节作为数据推入栈.
将接下来的11个字节作为数据推入栈.
将接下来的12个字节作为数据推入栈.
将接下来的13个字节作为数据推入栈.
将接下来的14个字节作为数据推入栈.
将接下来的15个字节作为数据推入栈.
将接下来的16个字节作为数据推入栈.
将接下来的17个字节作为数据推入栈.
将接下来的18个字节作为数据推入栈.
将接下来的19个字节作为数据推入栈.
将接下来的2个字节作为数据推入栈.
将接下来的20个字节作为数据推入栈.
将接下来的21个字节作为数据推入栈.
将接下来的22个字节作为数据推入栈.
将接下来的23个字节作为数据推入栈.
将接下来的24个字节作为数据推入栈.
将接下来的25个字节作为数据推入栈.
将接下来的26个字节作为数据推入栈.
将接下来的27个字节作为数据推入栈.
将接下来的28个字节作为数据推入栈.
将接下来的29个字节作为数据推入栈.
将接下来的3个字节作为数据推入栈.
将接下来的30个字节作为数据推入栈.
将接下来的31个字节作为数据推入栈.
将接下来的32个字节作为数据推入栈.
将接下来的33个字节作为数据推入栈.
将接下来的34个字节作为数据推入栈.
将接下来的35个字节作为数据推入栈.
将接下来的36个字节作为数据推入栈.
将接下来的37个字节作为数据推入栈.
将接下来的38个字节作为数据推入栈.
将接下来的39个字节作为数据推入栈.
将接下来的4个字节作为数据推入栈.
将接下来的40个字节作为数据推入栈.
将接下来的41个字节作为数据推入栈.
将接下来的42个字节作为数据推入栈.
将接下来的43个字节作为数据推入栈.
将接下来的44个字节作为数据推入栈.
将接下来的45个字节作为数据推入栈.
将接下来的46个字节作为数据推入栈.
将接下来的47个字节作为数据推入栈.
将接下来的48个字节作为数据推入栈.
将接下来的49个字节作为数据推入栈.
将接下来的5个字节作为数据推入栈.
将接下来的50个字节作为数据推入栈.
将接下来的51个字节作为数据推入栈.
将接下来的52个字节作为数据推入栈.
将接下来的53个字节作为数据推入栈.
将接下来的54个字节作为数据推入栈.
将接下来的55个字节作为数据推入栈.
将接下来的56个字节作为数据推入栈.
将接下来的57个字节作为数据推入栈.
将接下来的58个字节作为数据推入栈.
将接下来的59个字节作为数据推入栈.
将接下来的6个字节作为数据推入栈.
将接下来的60个字节作为数据推入栈.
将接下来的61个字节作为数据推入栈.
将接下来的62个字节作为数据推入栈.
将接下来的63个字节作为数据推入栈.
将接下来的64个字节作为数据推入栈.
将接下来的65个字节作为数据推入栈.
将接下来的66个字节作为数据推入栈.
将接下来的67个字节作为数据推入栈.
将接下来的68个字节作为数据推入栈.
将接下来的69个字节作为数据推入栈.
将接下来的7个字节作为数据推入栈.
将接下来的70个字节作为数据推入栈.
将接下来的71个字节作为数据推入栈.
将接下来的72个字节作为数据推入栈.
将接下来的73个字节作为数据推入栈.
将接下来的74个字节作为数据推入栈.
将接下来的75个字节作为数据推入栈.
将接下来的8个字节作为数据推入栈.
将接下来的9个字节作为数据推入栈.
复制栈顶元素.
检查栈顶两个元素是否相等,如果相等则移除它们,否则失败.
对栈顶元素进行SHA-256然后RIPEMD-160哈希.
接下来的一个字节表示要推入栈的数据长度.
接下来的两个字节表示要推入栈的数据长度.
接下来的四个字节表示要推入栈的数据长度.
条件为假.
跳过条件.
条件为真.
# Structs
Engine 是一个通用脚本执行引擎的结构体.
ResourceLimiter 用于限制脚本执行的资源使用.
ScriptBuilder 提供了构建自定义脚本的工具。 它允许您在遵守规范编码的同时推送操作码、整数和数据。 一般来说,它不能确保脚本正确执行,但是任何超出脚本引擎允许的最大限制并因此保证不执行的数据推送都不会被推送,并将导致脚本函数返回错误。
例如,以下代码将构建一个 2-of-3 多重签名脚本,用于支付脚本哈希(尽管在这种情况下 MultiSigScript() 是生成脚本的更好选择):
builder := NewScriptBuilder() builder.AddOp(OP_2).AddData(pubKey1).AddData(pubKey2) builder.AddData(pubKey3).AddOp(OP_3) builder.AddOp(OP_CHECKMULTISIG) script, err := builder.Script() if err != nil { // Handle the error.
ScriptTokenizer 提供了一种无需创建分配即可轻松高效地标记交易脚本的工具。 每个连续的操作码都使用 Next 函数进行解析,迭代完成后返回 false,这可能是由于成功标记整个脚本或遇到解析错误。 在失败的情况下,可以使用Err函数来获取具体的解析错误。
成功解析操作码后,可以分别通过 Opcode 和 Data 函数获取与其关联的操作码和数据。
ByteIndex 函数可用于获取分词器在原始脚本中的当前偏移量。.
SigCache 实现了一个结合了Schnorr和ECDSA签名验证的缓存,采用随机条目驱逐策略。 只有有效的签名才会被添加到缓存中。SigCache的好处有两方面: 首先,使用SigCache可以缓解一种DoS攻击,攻击会导致受害者的客户端由于处理攻击者 构造的无效交易时触发的最坏情况行为而挂起。关于被缓解的DoS攻击的详细描述可以在此处找到: https://bitslogger.wordpress.com/2013/01/23/fixed-bitcoin-vulnerability-explanation-why-the-signature-cache-is-a-dos-protection/。 其次,使用SigCache引入了签名验证优化,如果交易已经在mempool中被看到并验证过, 则可以加速区块中交易的验证。.
# Interfaces
CryptoAlgorithm 定义了加密算法的接口.
ExecutionEnvironment 定义了脚本执行环境的接口,允许脚本与外部系统交互.
# Type aliases
ErrScriptNotCanonical 标识非规范脚本。 调用者可以使用类型断言来检测此错误类型。.
Hash 用于多个消息和常见结构中,通常代表数据的双重 sha256 哈希。.
ScriptBuilderOpt 是一种函数选项类型,用于修改 ScriptBuilder 的初始化。.
ScriptFlags 是一个位掩码,定义执行脚本对时将完成的附加操作或测试.