forked from DNAProject/DNA
-
Notifications
You must be signed in to change notification settings - Fork 1
/
contract.go
118 lines (105 loc) · 3.73 KB
/
contract.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (C) 2018 The DNA Authors
* This file is part of The DNA library.
*
* The DNA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The DNA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with The DNA. If not, see <http://www.gnu.org/licenses/>.
*/
package states
import (
"io"
"github.com/dnaproject2/DNA/common"
"github.com/dnaproject2/DNA/common/serialization"
"github.com/dnaproject2/DNA/errors"
"github.com/dnaproject2/DNA/smartcontract/event"
)
// Invoke smart contract struct
// Param Version: invoke smart contract version, default 0
// Param Address: invoke on blockchain smart contract by address
// Param Method: invoke smart contract method, default ""
// Param Args: invoke smart contract arguments
type ContractInvokeParam struct {
Version byte
Address common.Address
Method string
Args []byte
}
// Serialize contract
func (this *ContractInvokeParam) Serialize(w io.Writer) error {
if err := serialization.WriteByte(w, this.Version); err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Version serialize error!")
}
if err := this.Address.Serialize(w); err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Address serialize error!")
}
if err := serialization.WriteVarBytes(w, []byte(this.Method)); err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Method serialize error!")
}
if err := serialization.WriteVarBytes(w, this.Args); err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Args serialize error!")
}
return nil
}
func (this *ContractInvokeParam) Serialization(sink *common.ZeroCopySink) {
sink.WriteByte(this.Version)
sink.WriteAddress(this.Address)
sink.WriteVarBytes([]byte(this.Method))
sink.WriteVarBytes([]byte(this.Args))
}
// Deserialize contract
func (this *ContractInvokeParam) Deserialize(r io.Reader) error {
var err error
this.Version, err = serialization.ReadByte(r)
if err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Version deserialize error!")
}
if err := this.Address.Deserialize(r); err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Address deserialize error!")
}
method, err := serialization.ReadVarBytes(r)
if err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Method deserialize error!")
}
this.Method = string(method)
this.Args, err = serialization.ReadVarBytes(r)
if err != nil {
return errors.NewDetailErr(err, errors.ErrNoCode, "[ContractInvokeParam] Args deserialize error!")
}
return nil
}
// `ContractInvokeParam.Args` has reference of `source`
func (this *ContractInvokeParam) Deserialization(source *common.ZeroCopySource) error {
var irregular, eof bool
this.Version, eof = source.NextByte()
this.Address, eof = source.NextAddress()
var method []byte
method, _, irregular, eof = source.NextVarBytes()
if irregular {
return common.ErrIrregularData
}
this.Method = string(method)
this.Args, _, irregular, eof = source.NextVarBytes()
if irregular {
return common.ErrIrregularData
}
if eof {
return io.ErrUnexpectedEOF
}
return nil
}
type PreExecResult struct {
State byte
Gas uint64
Result interface{}
Notify []*event.NotifyEventInfo
}