作業要件
(a)次の2つの線形方程式の解x、y)によって引き換えることができるトランザクションを生成します:
x + y =(前半のStudentID)およびxy =(後半のStudentID)
[整数解の存在を確認するには、右側の2つの数字の最後の桁を変更して、数字が両方とも偶数または両方が奇数になるようにします]。
(b)償還取引。償還スクリプトはできるだけ小さくする必要があります。言い換えれば、効果的なものscriptSig
は単に2つの整数xとyをスタックに送信する必要があります。でsumscriptPubKey
を使用してください。OP_ADD
OP_SUB
実現アイデア
この割り当ては、方程式を解いてから、解の2乗が正しいことを確認するように求めているように見えます。(しかし、実際にそのようなスクリプトを使用してビットコインを取引する場合、自分の通貨は他の誰かがそれを使用したくないので、ORZを使用するだけです)
ロック解除スクリプトはxとyであり、スタックに最初にプッシュされるのはxとyであり、接続します次のステップは、xとyが二乗の解であるかどうかを確認することです。
最初にxyを再度コピーします。これは、2つの方程式が両側を使用する必要があることを確認する必要があるため、使用されOP_2DUP
ます。その定義は次のようになっているため、スタックの上位2つの要素を割り当てることができます。
elif sop == OP_2DUP:
check_args(2)
v1 = stack[-2]
v2 = stack[-1]
stack.append(v1)
stack.append(v2)
次に、xとyを足し合わせてOP_ADD
スクリプトを使用します。実行すると、xとyがpop
削除され、結果push
がスタックに入れられます。
次に、result
これが元の式の値と一致しているかどうかを確認します。理由はOP_EQUALVERIFY
次のとおりです。戻り値を生成せず、使用するOP_EQUAL
と、処理できない真の値がスタックに残るためです。
elif sop == OP_EQUALVERIFY:
check_args(2)
v1 = stack[-1]
v2 = stack[-2]
if v1 == v2:
stack.pop()
stack.pop()
次に、前とほぼ同じアイデアで、最初に減算結果を取得し、それを式の値と比較し、OP_EQUAL
検証を使用して、スタックにtrue値を残します。ここでは、falseまたはtrueを直接返しているのではなく、trueを返していることがわかります。返される\x01
または、はtrueまたはfalseと同じ関数である必要があり、空はfalse、空ではないはtrue
elif sop == OP_EQUAL:
check_args(2)
v1 = stack.pop()
v2 = stack.pop()
if v1 == v2:
stack.append(b"\x01")
else:
stack.append(b"")
実装スクリプト
スクリプトをロックする
OP_2DUP
OP_ADD
<StudentID of First Half>
OP_EQUALVERIFY
OP_SUB
<StudentID of Second Half>
OP_EQUAL
スクリプトのロックを解除
<X> #解方程的得到的xy值
<y>
スクリプト実行プロセス
完全なスクリプト
<X>
<y>
-----
OP_2DUP
OP_ADD
<StudentID of First Half>
OP_EQUALVERIFY
OP_SUB
<StudentID of Second Half>
OP_EQUAL
作業工程
NULL #起始状态,栈内为空
<x> #x压栈
<x><y> #y压栈
<x><y><x><y> #OP_2DUP复制栈顶及栈顶下一个元素并压栈
<x><y><add_result> #OP_ADD弹出xy并且将xy相加的结果压栈
<x><y><add_result><stuid first> #学号前四位压栈
<x><y> #OP_EQUALVERIFY验证两个内容是否相等,相等则将其弹出
<sub_result> #OP_SUB弹出xy并且将xy相减的结果压栈
<sub_result><stuid second> #学号后三位压栈
ture #OP_EQUAL验证栈内的两个数值是否相等然后将true压栈
ピットに落ちる
それは無用だったOP_EQUALVERIFY
し、OP_EQUAL
使用OP_NUMEQUALVERIFY
して。OP_NUMEQUAL
のpython-bitcoinlib、Iのみのこぎりのソースコードを見てみるOP_NUMEQUALVERIFY
と、OP_NUMEQUAL
elif opcode == OP_NUMEQUAL:
bn = long(bn1 == bn2)
stack.pop()
stack.pop()
stack.append(bitcoin.core._bignum.bn2vch(bn))
elif opcode == OP_NUMEQUALVERIFY:
bn = long(bn1 == bn2)
if not bn:
err_raiser(VerifyOpFailedError, opcode)
else:
# No exception, so time to pop the stack
stack.pop()
stack.pop()
return
大きな問題はないようですが、スタックにOP_NUMEQUAL
直接bn
プッシュするのではなく、タイプbitcoin.core._bignum.bn2vch
を含む関数を呼び出します。呼び出された関数はbnを処理する可能性があるため、最終的にtureを取得する方法はありません。関数は定義なども調べましたが、他の関数が関数内で調整されていたため、はっきりとは見えませんでした。しかし、それはその機能のポットでなければなりません。(私はコインのシェアを無駄にしましたが、幸いなことに、私は10シェアを分割しました)bignum
bn
long