forked from TrueCloudLab/neoneo-go
1cf1fe5d74
Follow neo-project/neo#2044.
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package state
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
|
)
|
|
|
|
// Contract holds information about a smart contract in the NEO blockchain.
|
|
type Contract struct {
|
|
ID int32 `json:"id"`
|
|
UpdateCounter uint16 `json:"updatecounter"`
|
|
Hash util.Uint160 `json:"hash"`
|
|
Script []byte `json:"script"`
|
|
Manifest manifest.Manifest `json:"manifest"`
|
|
}
|
|
|
|
// DecodeBinary implements Serializable interface.
|
|
func (cs *Contract) DecodeBinary(br *io.BinReader) {
|
|
cs.ID = int32(br.ReadU32LE())
|
|
cs.UpdateCounter = br.ReadU16LE()
|
|
cs.Hash.DecodeBinary(br)
|
|
cs.Script = br.ReadVarBytes()
|
|
cs.Manifest.DecodeBinary(br)
|
|
}
|
|
|
|
// EncodeBinary implements Serializable interface.
|
|
func (cs *Contract) EncodeBinary(bw *io.BinWriter) {
|
|
bw.WriteU32LE(uint32(cs.ID))
|
|
bw.WriteU16LE(cs.UpdateCounter)
|
|
cs.Hash.EncodeBinary(bw)
|
|
bw.WriteVarBytes(cs.Script)
|
|
cs.Manifest.EncodeBinary(bw)
|
|
}
|
|
|
|
// CreateContractHash creates deployed contract hash from transaction sender
|
|
// and contract script.
|
|
func CreateContractHash(sender util.Uint160, script []byte) util.Uint160 {
|
|
w := io.NewBufBinWriter()
|
|
emit.Opcodes(w.BinWriter, opcode.ABORT)
|
|
emit.Bytes(w.BinWriter, sender.BytesBE())
|
|
emit.Bytes(w.BinWriter, script)
|
|
if w.Err != nil {
|
|
panic(w.Err)
|
|
}
|
|
return hash.Hash160(w.Bytes())
|
|
}
|