From: DeKaiju Date: Thu, 24 Jun 2021 09:07:55 +0000 (+0800) Subject: feat(bcrp): add bcrp test case (#1989) X-Git-Tag: bytom2-prerelease~1^2~86 X-Git-Url: http://git.osdn.net/view?p=bytom%2Fbytom.git;a=commitdiff_plain;h=efbfe08fb60144110d55d9f9f475149a967008d2 feat(bcrp): add bcrp test case (#1989) * feat(bcrp): add bcrp test case * feat(bcrp): code refactoring Co-authored-by: Paladz --- diff --git a/consensus/bcrp/bcrp.go b/consensus/bcrp/bcrp.go index 6e57d244..656a13fe 100644 --- a/consensus/bcrp/bcrp.go +++ b/consensus/bcrp/bcrp.go @@ -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 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 { diff --git a/consensus/bcrp/bcrp_test.go b/consensus/bcrp/bcrp_test.go index e45c785a..37f0abd6 100644 --- a/consensus/bcrp/bcrp_test.go +++ b/consensus/bcrp/bcrp_test.go @@ -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", }, } diff --git a/protocol/vm/vmutil/script_test.go b/protocol/vm/vmutil/script_test.go index 0ae067ee..db794d79 100644 --- a/protocol/vm/vmutil/script_test.go +++ b/protocol/vm/vmutil/script_test.go @@ -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 {