mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-13 12:33:42 +02:00
Merge feee029d29 into merged_master (Elements PR ElementsProject/elements#1020)
Messy merge conflicts because this PR backported some ad-hoc stuff from upstream while keeping a few things that upstream deleted. Hopefully reviewing is easier than doing this in the first place, since ultimately all I did was delete code from one side or another of the conflicts. (Ok, I also changed some boost optional stuff to std::optional, and had to patch up a test file for test framework changes.) When reviewing the detailed crypto, bear in mind that taptweaks, like all hashes are the kind of crypto that cannot be subtly wrong -- it will either fail very hard or be correct. And we have independent implementations in C++ and Python that cross-check each other, si it's unlikely to be the former.
This commit is contained in:
commit
6387aaf765
17 changed files with 1795 additions and 48 deletions
|
|
@ -33,7 +33,7 @@ MAX_SCRIPT_ELEMENT_SIZE = 520
|
|||
LOCKTIME_THRESHOLD = 500000000
|
||||
ANNEX_TAG = 0x50
|
||||
|
||||
LEAF_VERSION_TAPSCRIPT = 0xc0
|
||||
LEAF_VERSION_TAPSCRIPT = 0xc4
|
||||
|
||||
def hash160(s):
|
||||
return hashlib.new('ripemd160', sha256(s)).digest()
|
||||
|
|
@ -239,6 +239,8 @@ OP_CHECKSIG = CScriptOp(0xac)
|
|||
OP_CHECKSIGVERIFY = CScriptOp(0xad)
|
||||
OP_CHECKMULTISIG = CScriptOp(0xae)
|
||||
OP_CHECKMULTISIGVERIFY = CScriptOp(0xaf)
|
||||
OP_CHECKSIGFROMSTACK = CScriptOp(0xc1)
|
||||
OP_CHECKSIGFROMSTACKVERIFY = CScriptOp(0xc2)
|
||||
|
||||
# expansion
|
||||
OP_NOP1 = CScriptOp(0xb0)
|
||||
|
|
@ -255,6 +257,50 @@ OP_NOP10 = CScriptOp(0xb9)
|
|||
# BIP 342 opcodes (Tapscript)
|
||||
OP_CHECKSIGADD = CScriptOp(0xba)
|
||||
|
||||
# Elements Tapscript extension
|
||||
OP_SHA256INITIALIZE = CScriptOp(0xc4)
|
||||
OP_SHA256UPDATE = CScriptOp(0xc5)
|
||||
OP_SHA256FINALIZE = CScriptOp(0xc6)
|
||||
# inputs
|
||||
OP_INSPECTINPUTOUTPOINT = CScriptOp(0xc7)
|
||||
OP_INSPECTINPUTASSET = CScriptOp(0xc8)
|
||||
OP_INSPECTINPUTVALUE = CScriptOp(0xc9)
|
||||
OP_INSPECTINPUTSCRIPTPUBKEY = CScriptOp(0xca)
|
||||
OP_INSPECTINPUTSEQUENCE = CScriptOp(0xcb)
|
||||
OP_INSPECTINPUTISSUANCE = CScriptOp(0xcc)
|
||||
# current index
|
||||
OP_PUSHCURRENTINPUTINDEX = CScriptOp(0xcd)
|
||||
# outputs
|
||||
OP_INSPECTOUTPUTASSET = CScriptOp(0xce)
|
||||
OP_INSPECTOUTPUTVALUE = CScriptOp(0xcf)
|
||||
OP_INSPECTOUTPUTNONCE = CScriptOp(0xd0)
|
||||
OP_INSPECTOUTPUTSCRIPTPUBKEY = CScriptOp(0xd1)
|
||||
# transaction
|
||||
OP_INSPECTVERSION = CScriptOp(0xd2)
|
||||
OP_INSPECTLOCKTIME = CScriptOp(0xd3)
|
||||
OP_INSPECTNUMINPUTS = CScriptOp(0xd4)
|
||||
OP_INSPECTNUMOUTPUTS = CScriptOp(0xd5)
|
||||
OP_TXWEIGHT = CScriptOp(0xd6)
|
||||
|
||||
# Arithmetic opcodes
|
||||
OP_ADD64 = CScriptOp(0xd7)
|
||||
OP_SUB64 = CScriptOp(0xd8)
|
||||
OP_MUL64 = CScriptOp(0xd9)
|
||||
OP_DIV64 = CScriptOp(0xda)
|
||||
OP_NEG64 = CScriptOp(0xdb)
|
||||
OP_LESSTHAN64 = CScriptOp(0xdc)
|
||||
OP_LESSTHANOREQUAL64 = CScriptOp(0xdd)
|
||||
OP_GREATERTHAN64 = CScriptOp(0xde)
|
||||
OP_GREATERTHANOREQUAL64 = CScriptOp(0xdf)
|
||||
|
||||
# Conversion opcodes
|
||||
OP_SCRIPTNUMTOLE64 = CScriptOp(0xe0)
|
||||
OP_LE64TOSCRIPTNUM = CScriptOp(0xe1)
|
||||
OP_LE32TOLE64 = CScriptOp(0xe2)
|
||||
# Tapscript crypto opcodes
|
||||
OP_ECMULSCALARVERIFY = CScriptOp(0xe3)
|
||||
OP_TWEAKVERIFY = CScriptOp(0xe4)
|
||||
|
||||
OP_INVALIDOPCODE = CScriptOp(0xff)
|
||||
|
||||
OPCODE_NAMES.update({
|
||||
|
|
@ -371,6 +417,42 @@ OPCODE_NAMES.update({
|
|||
OP_NOP10: 'OP_NOP10',
|
||||
OP_CHECKSIGADD: 'OP_CHECKSIGADD',
|
||||
OP_INVALIDOPCODE: 'OP_INVALIDOPCODE',
|
||||
OP_SHA256INITIALIZE : 'OP_SHA256INITIALIZE',
|
||||
OP_SHA256UPDATE : 'OP_SHA256UPDATE',
|
||||
OP_SHA256FINALIZE : 'OP_SHA256FINALIZE',
|
||||
OP_INSPECTINPUTOUTPOINT: 'OP_INSPECTINPUTOUTPOINT',
|
||||
OP_INSPECTINPUTASSET: 'OP_INSPECTINPUTASSET',
|
||||
OP_INSPECTINPUTVALUE: 'OP_INSPECTINPUTVALUE',
|
||||
OP_INSPECTINPUTSCRIPTPUBKEY: 'OP_INSPECTINPUTSCRIPTPUBKEY',
|
||||
OP_INSPECTINPUTSEQUENCE: 'OP_INSPECTINPUTSEQUENCE',
|
||||
OP_INSPECTINPUTISSUANCE: 'OP_INSPECTINPUTISSUANCE',
|
||||
OP_PUSHCURRENTINPUTINDEX: 'OP_PUSHCURRENTINPUTINDEX',
|
||||
OP_INSPECTOUTPUTASSET: 'OP_INSPECTOUTPUTASSET',
|
||||
OP_INSPECTOUTPUTVALUE: 'OP_INSPECTOUTPUTVALUE',
|
||||
OP_INSPECTOUTPUTNONCE: 'OP_INSPECTOUTPUTNONCE',
|
||||
OP_INSPECTOUTPUTSCRIPTPUBKEY: 'OP_INSPECTOUTPUTSCRIPTPUBKEY',
|
||||
OP_INSPECTVERSION: 'OP_INSPECTVERSION',
|
||||
OP_INSPECTLOCKTIME: 'OP_INSPECTLOCKTIME',
|
||||
OP_INSPECTNUMINPUTS: 'OP_INSPECTNUMINPUTS',
|
||||
OP_INSPECTNUMOUTPUTS: 'OP_INSPECTNUMOUTPUTS',
|
||||
OP_TXWEIGHT: 'OP_TXWEIGHT',
|
||||
OP_INVALIDOPCODE: 'OP_INVALIDOPCODE',
|
||||
OP_CHECKSIGFROMSTACK: 'OP_CHECKSIGFROMSTACK',
|
||||
OP_TWEAKVERIFY: 'OP_TWEAKVERIFY',
|
||||
OP_ADD64: 'OP_ADD64',
|
||||
OP_SUB64: 'OP_SUB64',
|
||||
OP_MUL64: 'OP_MUL64',
|
||||
OP_DIV64: 'OP_DIV64',
|
||||
OP_LESSTHAN64: 'OP_LESSTHAN64',
|
||||
OP_LESSTHANOREQUAL64: 'OP_LESSTHANOREQUAL64',
|
||||
OP_GREATERTHAN64: 'OP_GREATERTHAN64',
|
||||
OP_GREATERTHANOREQUAL64: 'OP_GREATERTHANOREQUAL64',
|
||||
OP_NEG64: 'OP_NEG64',
|
||||
OP_SCRIPTNUMTOLE64: 'OP_SCRIPTNUMTOLE64',
|
||||
OP_LE64TOSCRIPTNUM: 'OP_LE64TOSCRIPTNUM',
|
||||
OP_LE32TOLE64: 'OP_LE32TOLE64',
|
||||
OP_CHECKSIGFROMSTACKVERIFY: 'OP_CHECKSIGFROMSTACKVERIFY',
|
||||
OP_ECMULSCALARVERIFY: 'OP_ECMULSCALARVERIFY',
|
||||
})
|
||||
|
||||
class CScriptInvalidError(Exception):
|
||||
|
|
@ -948,4 +1030,4 @@ def taproot_construct(pubkey, scripts=None):
|
|||
return TaprootInfo(CScript([OP_1, tweaked]), pubkey, negated + 0, tweak, leaves)
|
||||
|
||||
def is_op_success(o):
|
||||
return o == 80 or o == 98 or (o >= 137 and o <= 138) or (o >= 141 and o <= 142) or (o >= 149 and o <= 151) or (o >= 187 and o <= 191) or (o >= 196 and o <= 254)
|
||||
return o == 80 or o == 98 or (o >= 137 and o <= 138) or (o >= 141 and o <= 142) or (o >= 149 and o <= 151) or (o >= 187 and o <= 191) or (o >= 229 and o <= 254)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue