OSDN Git Service

feat(bcrp): add bcrp test case (#1989)
authorDeKaiju <longjinglv@163.com>
Thu, 24 Jun 2021 09:07:55 +0000 (17:07 +0800)
committerGitHub <noreply@github.com>
Thu, 24 Jun 2021 09:07:55 +0000 (17:07 +0800)
* feat(bcrp): add bcrp test case

* feat(bcrp): code refactoring

Co-authored-by: Paladz <yzhu101@uottawa.ca>
consensus/bcrp/bcrp.go
consensus/bcrp/bcrp_test.go
protocol/vm/vmutil/script_test.go

index 6e57d24..656a13f 100644 (file)
@@ -15,7 +15,11 @@ const BCRP = "bcrp"
 const Version = 1
 
 // IsBCRPScript checks if a control program is bytom contract register protocol
-// BCRP script format: OP_FAIL + OP_PUSHDATA1 + "04" + hex("bcrp") + OP_PUSHDATA1 + "01" + "01" + OP_PUSHDATA1 + len(contract) + contract
+// BCRP script format: OP_FAIL + OP_DATA_4 + "bcrp" + OP_DATA_1 + "1" + {{dynamic_op}} + contract
+// 0 < len(contract) <= 75       dynamic_op -> OP_DATA_N
+// 75 <len(contract) < 256       dynamic_op -> OP_PUSHDATA1
+// 256 <= len(contract) < 65536  dynamic_op -> OP_PUSHDATA2
+// len(contract) >= 65536        dynamic_op -> OP_PUSHDATA4
 func IsBCRPScript(prog []byte) bool {
        inst, err := vm.ParseProgram(prog)
        if err != nil {
@@ -42,7 +46,7 @@ func IsBCRPScript(prog []byte) bool {
 }
 
 // IsCallContractScript checks if a program is script call contract registered by BCRP
-// call contract script format: OP_1 + OP_PUSHDATA1 + SHA3-256(contract)
+// call contract script format: OP_DATA_4 + "bcrp"+ OP_DATA_32 + SHA3-256(contract)
 func IsCallContractScript(prog []byte) bool {
        insts, err := vm.ParseProgram(prog)
        if err != nil {
@@ -61,7 +65,7 @@ func IsCallContractScript(prog []byte) bool {
 }
 
 // ParseContractHash parse contract hash from call BCRP script
-// call BCRP script format: OP_1 + OP_DATA_32 + SHA3-256(contract)
+// call contract script format: OP_DATA_4 + "bcrp"+ OP_DATA_32 + SHA3-256(contract)
 func ParseContractHash(prog []byte) ([32]byte, error) {
        insts, err := vm.ParseProgram(prog)
        if err != nil {
index e45c785..37f0abd 100644 (file)
@@ -19,22 +19,55 @@ func TestIsBCRPScript(t *testing.T) {
                        expected: false,
                },
                {
-                       program:  "694c04626372704c01014c2820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
+                       // not OP_FAIL
+                       program:  "69046263727001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                        expected: false,
                },
                {
-                       program:  "6a4c04424352504c01014c2820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
+                       // not bcrp
+                       program:  "6a044243525001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                        expected: false,
                },
                {
-                       program:  "6a4c04626372704c01024c2820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
+                       // not version 1
+                       program:  "6a046263727001022820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                        expected: false,
                },
-
                {
+                       // len(contract) == 0
+                       program:  "6a046263727001016a",
+                       expected: false,
+               },
+               {
+                       // len(contract) == 1
+                       program:  "6a04626372700101016a",
+                       expected: true,
+               },
+               {
+                       // 1 < len(contract) < 75
                        program:  "6a046263727001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                        expected: true,
                },
+               {
+                       // len(contract) == 75
+                       program:  "6a046263727001014b20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+                       expected: true,
+               },
+               {
+                       // 75 < len(contract) < 256
+                       program:  "6a046263727001014c9620e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+                       expected: true,
+               },
+               {
+                       // len(contract) == 256
+                       program:  "6a046263727001014d000120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e",
+                       expected: true,
+               },
+               {
+                       // len(contract) > 256
+                       program:  "6a046263727001014d2c0120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+                       expected: true,
+               },
        }
 
        for i, test := range tests {
@@ -96,9 +129,9 @@ func TestParseContractHash(t *testing.T) {
                expected string
        }{
                {
-                       //call BCRP script format: OP_1 + OP_DATA_32 + SHA3-256(contract)
-                       program:  "5120605f9b8e978bb3956d729047e556cdf4b56238348d4293ad9afef376462063c5",
-                       expected: "605f9b8e978bb3956d729047e556cdf4b56238348d4293ad9afef376462063c5",
+                       // call contract script format: OP_DATA_4 + "bcrp"+ OP_DATA_32 + SHA3-256(contract)
+                       program:  "0462637270204e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
+                       expected: "4e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
                },
        }
 
index 0ae067e..db794d7 100644 (file)
@@ -225,9 +225,20 @@ func TestRegisterProgram(t *testing.T) {
                expected string
        }{
                {
+                       // len(contract) == 40
                        contract: "20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                        expected: "6a046263727001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
                },
+               {
+                       // len(contract) == 150
+                       contract: "20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+                       expected: "6a046263727001014c9620e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+               },
+               {
+                       // len(contract) == 300
+                       contract: "20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+                       expected: "6a046263727001014d2c0120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
+               },
        }
 
        for _, test := range tests {