encode.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package rlp
  17. import (
  18. "errors"
  19. "fmt"
  20. "io"
  21. "math/big"
  22. "reflect"
  23. "github.com/ethereum/go-ethereum/rlp/internal/rlpstruct"
  24. )
  25. var (
  26. // Common encoded values.
  27. // These are useful when implementing EncodeRLP.
  28. EmptyString = []byte{0x80}
  29. EmptyList = []byte{0xC0}
  30. )
  31. var ErrNegativeBigInt = errors.New("rlp: cannot encode negative big.Int")
  32. // Encoder is implemented by types that require custom
  33. // encoding rules or want to encode private fields.
  34. type Encoder interface {
  35. // EncodeRLP should write the RLP encoding of its receiver to w.
  36. // If the implementation is a pointer method, it may also be
  37. // called for nil pointers.
  38. //
  39. // Implementations should generate valid RLP. The data written is
  40. // not verified at the moment, but a future version might. It is
  41. // recommended to write only a single value but writing multiple
  42. // values or no value at all is also permitted.
  43. EncodeRLP(io.Writer) error
  44. }
  45. // Encode writes the RLP encoding of val to w. Note that Encode may
  46. // perform many small writes in some cases. Consider making w
  47. // buffered.
  48. //
  49. // Please see package-level documentation of encoding rules.
  50. func Encode(w io.Writer, val interface{}) error {
  51. // Optimization: reuse *encBuffer when called by EncodeRLP.
  52. if buf := encBufferFromWriter(w); buf != nil {
  53. return buf.encode(val)
  54. }
  55. buf := getEncBuffer()
  56. defer encBufferPool.Put(buf)
  57. if err := buf.encode(val); err != nil {
  58. return err
  59. }
  60. return buf.writeTo(w)
  61. }
  62. // EncodeToBytes returns the RLP encoding of val.
  63. // Please see package-level documentation for the encoding rules.
  64. func EncodeToBytes(val interface{}) ([]byte, error) {
  65. buf := getEncBuffer()
  66. defer encBufferPool.Put(buf)
  67. if err := buf.encode(val); err != nil {
  68. return nil, err
  69. }
  70. return buf.makeBytes(), nil
  71. }
  72. // EncodeToReader returns a reader from which the RLP encoding of val
  73. // can be read. The returned size is the total size of the encoded
  74. // data.
  75. //
  76. // Please see the documentation of Encode for the encoding rules.
  77. func EncodeToReader(val interface{}) (size int, r io.Reader, err error) {
  78. buf := getEncBuffer()
  79. if err := buf.encode(val); err != nil {
  80. encBufferPool.Put(buf)
  81. return 0, nil, err
  82. }
  83. // Note: can't put the reader back into the pool here
  84. // because it is held by encReader. The reader puts it
  85. // back when it has been fully consumed.
  86. return buf.size(), &encReader{buf: buf}, nil
  87. }
  88. type listhead struct {
  89. offset int // index of this header in string data
  90. size int // total size of encoded data (including list headers)
  91. }
  92. // encode writes head to the given buffer, which must be at least
  93. // 9 bytes long. It returns the encoded bytes.
  94. func (head *listhead) encode(buf []byte) []byte {
  95. return buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))]
  96. }
  97. // headsize returns the size of a list or string header
  98. // for a value of the given size.
  99. func headsize(size uint64) int {
  100. if size < 56 {
  101. return 1
  102. }
  103. return 1 + intsize(size)
  104. }
  105. // puthead writes a list or string header to buf.
  106. // buf must be at least 9 bytes long.
  107. func puthead(buf []byte, smalltag, largetag byte, size uint64) int {
  108. if size < 56 {
  109. buf[0] = smalltag + byte(size)
  110. return 1
  111. }
  112. sizesize := putint(buf[1:], size)
  113. buf[0] = largetag + byte(sizesize)
  114. return sizesize + 1
  115. }
  116. var encoderInterface = reflect.TypeOf(new(Encoder)).Elem()
  117. // makeWriter creates a writer function for the given type.
  118. func makeWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) {
  119. kind := typ.Kind()
  120. switch {
  121. case typ == rawValueType:
  122. return writeRawValue, nil
  123. case typ.AssignableTo(reflect.PtrTo(bigInt)):
  124. return writeBigIntPtr, nil
  125. case typ.AssignableTo(bigInt):
  126. return writeBigIntNoPtr, nil
  127. case kind == reflect.Ptr:
  128. return makePtrWriter(typ, ts)
  129. case reflect.PtrTo(typ).Implements(encoderInterface):
  130. return makeEncoderWriter(typ), nil
  131. case isUint(kind):
  132. return writeUint, nil
  133. case kind == reflect.Bool:
  134. return writeBool, nil
  135. case kind == reflect.String:
  136. return writeString, nil
  137. case kind == reflect.Slice && isByte(typ.Elem()):
  138. return writeBytes, nil
  139. case kind == reflect.Array && isByte(typ.Elem()):
  140. return makeByteArrayWriter(typ), nil
  141. case kind == reflect.Slice || kind == reflect.Array:
  142. return makeSliceWriter(typ, ts)
  143. case kind == reflect.Struct:
  144. return makeStructWriter(typ)
  145. case kind == reflect.Interface:
  146. return writeInterface, nil
  147. default:
  148. return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
  149. }
  150. }
  151. func writeRawValue(val reflect.Value, w *encBuffer) error {
  152. w.str = append(w.str, val.Bytes()...)
  153. return nil
  154. }
  155. func writeUint(val reflect.Value, w *encBuffer) error {
  156. w.writeUint64(val.Uint())
  157. return nil
  158. }
  159. func writeBool(val reflect.Value, w *encBuffer) error {
  160. w.writeBool(val.Bool())
  161. return nil
  162. }
  163. func writeBigIntPtr(val reflect.Value, w *encBuffer) error {
  164. ptr := val.Interface().(*big.Int)
  165. if ptr == nil {
  166. w.str = append(w.str, 0x80)
  167. return nil
  168. }
  169. if ptr.Sign() == -1 {
  170. return ErrNegativeBigInt
  171. }
  172. w.writeBigInt(ptr)
  173. return nil
  174. }
  175. func writeBigIntNoPtr(val reflect.Value, w *encBuffer) error {
  176. i := val.Interface().(big.Int)
  177. if i.Sign() == -1 {
  178. return ErrNegativeBigInt
  179. }
  180. w.writeBigInt(&i)
  181. return nil
  182. }
  183. func writeBytes(val reflect.Value, w *encBuffer) error {
  184. w.writeBytes(val.Bytes())
  185. return nil
  186. }
  187. func makeByteArrayWriter(typ reflect.Type) writer {
  188. switch typ.Len() {
  189. case 0:
  190. return writeLengthZeroByteArray
  191. case 1:
  192. return writeLengthOneByteArray
  193. default:
  194. length := typ.Len()
  195. return func(val reflect.Value, w *encBuffer) error {
  196. if !val.CanAddr() {
  197. // Getting the byte slice of val requires it to be addressable. Make it
  198. // addressable by copying.
  199. copy := reflect.New(val.Type()).Elem()
  200. copy.Set(val)
  201. val = copy
  202. }
  203. slice := byteArrayBytes(val, length)
  204. w.encodeStringHeader(len(slice))
  205. w.str = append(w.str, slice...)
  206. return nil
  207. }
  208. }
  209. }
  210. func writeLengthZeroByteArray(val reflect.Value, w *encBuffer) error {
  211. w.str = append(w.str, 0x80)
  212. return nil
  213. }
  214. func writeLengthOneByteArray(val reflect.Value, w *encBuffer) error {
  215. b := byte(val.Index(0).Uint())
  216. if b <= 0x7f {
  217. w.str = append(w.str, b)
  218. } else {
  219. w.str = append(w.str, 0x81, b)
  220. }
  221. return nil
  222. }
  223. func writeString(val reflect.Value, w *encBuffer) error {
  224. s := val.String()
  225. if len(s) == 1 && s[0] <= 0x7f {
  226. // fits single byte, no string header
  227. w.str = append(w.str, s[0])
  228. } else {
  229. w.encodeStringHeader(len(s))
  230. w.str = append(w.str, s...)
  231. }
  232. return nil
  233. }
  234. func writeInterface(val reflect.Value, w *encBuffer) error {
  235. if val.IsNil() {
  236. // Write empty list. This is consistent with the previous RLP
  237. // encoder that we had and should therefore avoid any
  238. // problems.
  239. w.str = append(w.str, 0xC0)
  240. return nil
  241. }
  242. eval := val.Elem()
  243. writer, err := cachedWriter(eval.Type())
  244. if err != nil {
  245. return err
  246. }
  247. return writer(eval, w)
  248. }
  249. func makeSliceWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) {
  250. etypeinfo := theTC.infoWhileGenerating(typ.Elem(), rlpstruct.Tags{})
  251. if etypeinfo.writerErr != nil {
  252. return nil, etypeinfo.writerErr
  253. }
  254. var wfn writer
  255. if ts.Tail {
  256. // This is for struct tail slices.
  257. // w.list is not called for them.
  258. wfn = func(val reflect.Value, w *encBuffer) error {
  259. vlen := val.Len()
  260. for i := 0; i < vlen; i++ {
  261. if err := etypeinfo.writer(val.Index(i), w); err != nil {
  262. return err
  263. }
  264. }
  265. return nil
  266. }
  267. } else {
  268. // This is for regular slices and arrays.
  269. wfn = func(val reflect.Value, w *encBuffer) error {
  270. vlen := val.Len()
  271. if vlen == 0 {
  272. w.str = append(w.str, 0xC0)
  273. return nil
  274. }
  275. listOffset := w.list()
  276. for i := 0; i < vlen; i++ {
  277. if err := etypeinfo.writer(val.Index(i), w); err != nil {
  278. return err
  279. }
  280. }
  281. w.listEnd(listOffset)
  282. return nil
  283. }
  284. }
  285. return wfn, nil
  286. }
  287. func makeStructWriter(typ reflect.Type) (writer, error) {
  288. fields, err := structFields(typ)
  289. if err != nil {
  290. return nil, err
  291. }
  292. for _, f := range fields {
  293. if f.info.writerErr != nil {
  294. return nil, structFieldError{typ, f.index, f.info.writerErr}
  295. }
  296. }
  297. var writer writer
  298. firstOptionalField := firstOptionalField(fields)
  299. if firstOptionalField == len(fields) {
  300. // This is the writer function for structs without any optional fields.
  301. writer = func(val reflect.Value, w *encBuffer) error {
  302. lh := w.list()
  303. for _, f := range fields {
  304. if err := f.info.writer(val.Field(f.index), w); err != nil {
  305. return err
  306. }
  307. }
  308. w.listEnd(lh)
  309. return nil
  310. }
  311. } else {
  312. // If there are any "optional" fields, the writer needs to perform additional
  313. // checks to determine the output list length.
  314. writer = func(val reflect.Value, w *encBuffer) error {
  315. lastField := len(fields) - 1
  316. for ; lastField >= firstOptionalField; lastField-- {
  317. if !val.Field(fields[lastField].index).IsZero() {
  318. break
  319. }
  320. }
  321. lh := w.list()
  322. for i := 0; i <= lastField; i++ {
  323. if err := fields[i].info.writer(val.Field(fields[i].index), w); err != nil {
  324. return err
  325. }
  326. }
  327. w.listEnd(lh)
  328. return nil
  329. }
  330. }
  331. return writer, nil
  332. }
  333. func makePtrWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) {
  334. nilEncoding := byte(0xC0)
  335. if typeNilKind(typ.Elem(), ts) == String {
  336. nilEncoding = 0x80
  337. }
  338. etypeinfo := theTC.infoWhileGenerating(typ.Elem(), rlpstruct.Tags{})
  339. if etypeinfo.writerErr != nil {
  340. return nil, etypeinfo.writerErr
  341. }
  342. writer := func(val reflect.Value, w *encBuffer) error {
  343. if ev := val.Elem(); ev.IsValid() {
  344. return etypeinfo.writer(ev, w)
  345. }
  346. w.str = append(w.str, nilEncoding)
  347. return nil
  348. }
  349. return writer, nil
  350. }
  351. func makeEncoderWriter(typ reflect.Type) writer {
  352. if typ.Implements(encoderInterface) {
  353. return func(val reflect.Value, w *encBuffer) error {
  354. return val.Interface().(Encoder).EncodeRLP(w)
  355. }
  356. }
  357. w := func(val reflect.Value, w *encBuffer) error {
  358. if !val.CanAddr() {
  359. // package json simply doesn't call MarshalJSON for this case, but encodes the
  360. // value as if it didn't implement the interface. We don't want to handle it that
  361. // way.
  362. return fmt.Errorf("rlp: unadressable value of type %v, EncodeRLP is pointer method", val.Type())
  363. }
  364. return val.Addr().Interface().(Encoder).EncodeRLP(w)
  365. }
  366. return w
  367. }
  368. // putint writes i to the beginning of b in big endian byte
  369. // order, using the least number of bytes needed to represent i.
  370. func putint(b []byte, i uint64) (size int) {
  371. switch {
  372. case i < (1 << 8):
  373. b[0] = byte(i)
  374. return 1
  375. case i < (1 << 16):
  376. b[0] = byte(i >> 8)
  377. b[1] = byte(i)
  378. return 2
  379. case i < (1 << 24):
  380. b[0] = byte(i >> 16)
  381. b[1] = byte(i >> 8)
  382. b[2] = byte(i)
  383. return 3
  384. case i < (1 << 32):
  385. b[0] = byte(i >> 24)
  386. b[1] = byte(i >> 16)
  387. b[2] = byte(i >> 8)
  388. b[3] = byte(i)
  389. return 4
  390. case i < (1 << 40):
  391. b[0] = byte(i >> 32)
  392. b[1] = byte(i >> 24)
  393. b[2] = byte(i >> 16)
  394. b[3] = byte(i >> 8)
  395. b[4] = byte(i)
  396. return 5
  397. case i < (1 << 48):
  398. b[0] = byte(i >> 40)
  399. b[1] = byte(i >> 32)
  400. b[2] = byte(i >> 24)
  401. b[3] = byte(i >> 16)
  402. b[4] = byte(i >> 8)
  403. b[5] = byte(i)
  404. return 6
  405. case i < (1 << 56):
  406. b[0] = byte(i >> 48)
  407. b[1] = byte(i >> 40)
  408. b[2] = byte(i >> 32)
  409. b[3] = byte(i >> 24)
  410. b[4] = byte(i >> 16)
  411. b[5] = byte(i >> 8)
  412. b[6] = byte(i)
  413. return 7
  414. default:
  415. b[0] = byte(i >> 56)
  416. b[1] = byte(i >> 48)
  417. b[2] = byte(i >> 40)
  418. b[3] = byte(i >> 32)
  419. b[4] = byte(i >> 24)
  420. b[5] = byte(i >> 16)
  421. b[6] = byte(i >> 8)
  422. b[7] = byte(i)
  423. return 8
  424. }
  425. }
  426. // intsize computes the minimum number of bytes required to store i.
  427. func intsize(i uint64) (size int) {
  428. for size = 1; ; size++ {
  429. if i >>= 8; i == 0 {
  430. return size
  431. }
  432. }
  433. }