github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/storage/record/serialize.go (about) 1 /* 2 * Copyright 2019 Insolar Technologies 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package record 18 19 import ( 20 "bytes" 21 "encoding/binary" 22 23 "github.com/insolar/insolar/core" 24 "github.com/ugorji/go/codec" 25 ) 26 27 // SerializeType returns binary representation of provided type. 28 func SerializeType(id TypeID) []byte { 29 buf := make([]byte, TypeIDSize) 30 binary.BigEndian.PutUint32(buf, uint32(id)) 31 return buf 32 } 33 34 // DeserializeType returns type from provided binary representation. 35 func DeserializeType(buf []byte) TypeID { 36 return TypeID(binary.BigEndian.Uint32(buf)) 37 } 38 39 // SerializeRecord returns binary representation of provided record. 40 func SerializeRecord(rec Record) []byte { 41 typeBytes := SerializeType(TypeFromRecord(rec)) 42 buff := bytes.NewBuffer(typeBytes) 43 enc := codec.NewEncoder(buff, &codec.CborHandle{}) 44 enc.MustEncode(rec) 45 return buff.Bytes() 46 } 47 48 // DeserializeRecord returns record decoded from bytes. 49 func DeserializeRecord(buf []byte) Record { 50 t := DeserializeType(buf[:TypeIDSize]) 51 dec := codec.NewDecoderBytes(buf[TypeIDSize:], &codec.CborHandle{}) 52 rec := RecordFromType(t) 53 dec.MustDecode(&rec) 54 return rec 55 } 56 57 // CalculateIDForBlob calculate id for blob with using current pulse number 58 func CalculateIDForBlob(scheme core.PlatformCryptographyScheme, pulseNumber core.PulseNumber, blob []byte) *core.RecordID { 59 hasher := scheme.IntegrityHasher() 60 _, err := hasher.Write(blob) 61 if err != nil { 62 panic(err) 63 } 64 return core.NewRecordID(pulseNumber, hasher.Sum(nil)) 65 }