ブロックチェーンジョブ3は、2つの線形方程式を介して償還トランザクションを生成します

作業要件

(a)次の2つの線形方程式の解x、y)によって引き換えることができるトランザクションを生成します:
x + y =(前半のStudentID)およびxy =(後半のStudentID)
[整数解の存在を確認するには、右側の2つの数字の最後の桁を変更して、数字が両方とも偶数または両方が奇数になるようにします]。
(b)償還取引。償還スクリプトはできるだけ小さくする必要があります。言い換えれば、効果的なものscriptSigは単に2つの整数xとyをスタックに送信する必要があります。sumscriptPubKeyを使用してくださいOP_ADDOP_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シェアを分割しました)bignumbnlong

おすすめ

転載: blog.csdn.net/weixin_44190459/article/details/109634739