encode.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  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. "fmt"
  19. "io"
  20. "math/big"
  21. "reflect"
  22. "sync"
  23. )
  24. var (
  25. // Common encoded values.
  26. // These are useful when implementing EncodeRLP.
  27. EmptyString = []byte{0x80}
  28. EmptyList = []byte{0xC0}
  29. )
  30. // Encoder is implemented by types that require custom
  31. // encoding rules or want to encode private fields.
  32. type Encoder interface {
  33. // EncodeRLP should write the RLP encoding of its receiver to w.
  34. // If the implementation is a pointer method, it may also be
  35. // called for nil pointers.
  36. //
  37. // Implementations should generate valid RLP. The data written is
  38. // not verified at the moment, but a future version might. It is
  39. // recommended to write only a single value but writing multiple
  40. // values or no value at all is also permitted.
  41. EncodeRLP(io.Writer) error
  42. }
  43. // Encode writes the RLP encoding of val to w. Note that Encode may
  44. // perform many small writes in some cases. Consider making w
  45. // buffered.
  46. //
  47. // Please see package-level documentation of encoding rules.
  48. func Encode(w io.Writer, val interface{}) error {
  49. if outer, ok := w.(*encbuf); ok {
  50. // Encode was called by some type's EncodeRLP.
  51. // Avoid copying by writing to the outer encbuf directly.
  52. return outer.encode(val)
  53. }
  54. eb := encbufPool.Get().(*encbuf)
  55. defer encbufPool.Put(eb)
  56. eb.reset()
  57. if err := eb.encode(val); err != nil {
  58. return err
  59. }
  60. return eb.toWriter(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. eb := encbufPool.Get().(*encbuf)
  66. defer encbufPool.Put(eb)
  67. eb.reset()
  68. if err := eb.encode(val); err != nil {
  69. return nil, err
  70. }
  71. return eb.toBytes(), nil
  72. }
  73. // EncodeToReader returns a reader from which the RLP encoding of val
  74. // can be read. The returned size is the total size of the encoded
  75. // data.
  76. //
  77. // Please see the documentation of Encode for the encoding rules.
  78. func EncodeToReader(val interface{}) (size int, r io.Reader, err error) {
  79. eb := encbufPool.Get().(*encbuf)
  80. eb.reset()
  81. if err := eb.encode(val); err != nil {
  82. return 0, nil, err
  83. }
  84. return eb.size(), &encReader{buf: eb}, nil
  85. }
  86. type listhead struct {
  87. offset int // index of this header in string data
  88. size int // total size of encoded data (including list headers)
  89. }
  90. // encode writes head to the given buffer, which must be at least
  91. // 9 bytes long. It returns the encoded bytes.
  92. func (head *listhead) encode(buf []byte) []byte {
  93. return buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))]
  94. }
  95. // headsize returns the size of a list or string header
  96. // for a value of the given size.
  97. func headsize(size uint64) int {
  98. if size < 56 {
  99. return 1
  100. }
  101. return 1 + intsize(size)
  102. }
  103. // puthead writes a list or string header to buf.
  104. // buf must be at least 9 bytes long.
  105. func puthead(buf []byte, smalltag, largetag byte, size uint64) int {
  106. if size < 56 {
  107. buf[0] = smalltag + byte(size)
  108. return 1
  109. }
  110. sizesize := putint(buf[1:], size)
  111. buf[0] = largetag + byte(sizesize)
  112. return sizesize + 1
  113. }
  114. type encbuf struct {
  115. str []byte // string data, contains everything except list headers
  116. lheads []listhead // all list headers
  117. lhsize int // sum of sizes of all encoded list headers
  118. sizebuf [9]byte // auxiliary buffer for uint encoding
  119. bufvalue reflect.Value // used in writeByteArrayCopy
  120. }
  121. // encbufs are pooled.
  122. var encbufPool = sync.Pool{
  123. New: func() interface{} {
  124. var bytes []byte
  125. return &encbuf{bufvalue: reflect.ValueOf(&bytes).Elem()}
  126. },
  127. }
  128. func (w *encbuf) reset() {
  129. w.lhsize = 0
  130. w.str = w.str[:0]
  131. w.lheads = w.lheads[:0]
  132. }
  133. // encbuf implements io.Writer so it can be passed it into EncodeRLP.
  134. func (w *encbuf) Write(b []byte) (int, error) {
  135. w.str = append(w.str, b...)
  136. return len(b), nil
  137. }
  138. func (w *encbuf) encode(val interface{}) error {
  139. rval := reflect.ValueOf(val)
  140. writer, err := cachedWriter(rval.Type())
  141. if err != nil {
  142. return err
  143. }
  144. return writer(rval, w)
  145. }
  146. func (w *encbuf) encodeStringHeader(size int) {
  147. if size < 56 {
  148. w.str = append(w.str, 0x80+byte(size))
  149. } else {
  150. sizesize := putint(w.sizebuf[1:], uint64(size))
  151. w.sizebuf[0] = 0xB7 + byte(sizesize)
  152. w.str = append(w.str, w.sizebuf[:sizesize+1]...)
  153. }
  154. }
  155. func (w *encbuf) encodeString(b []byte) {
  156. if len(b) == 1 && b[0] <= 0x7F {
  157. // fits single byte, no string header
  158. w.str = append(w.str, b[0])
  159. } else {
  160. w.encodeStringHeader(len(b))
  161. w.str = append(w.str, b...)
  162. }
  163. }
  164. func (w *encbuf) encodeUint(i uint64) {
  165. if i == 0 {
  166. w.str = append(w.str, 0x80)
  167. } else if i < 128 {
  168. // fits single byte
  169. w.str = append(w.str, byte(i))
  170. } else {
  171. s := putint(w.sizebuf[1:], i)
  172. w.sizebuf[0] = 0x80 + byte(s)
  173. w.str = append(w.str, w.sizebuf[:s+1]...)
  174. }
  175. }
  176. // list adds a new list header to the header stack. It returns the index
  177. // of the header. The caller must call listEnd with this index after encoding
  178. // the content of the list.
  179. func (w *encbuf) list() int {
  180. w.lheads = append(w.lheads, listhead{offset: len(w.str), size: w.lhsize})
  181. return len(w.lheads) - 1
  182. }
  183. func (w *encbuf) listEnd(index int) {
  184. lh := &w.lheads[index]
  185. lh.size = w.size() - lh.offset - lh.size
  186. if lh.size < 56 {
  187. w.lhsize++ // length encoded into kind tag
  188. } else {
  189. w.lhsize += 1 + intsize(uint64(lh.size))
  190. }
  191. }
  192. func (w *encbuf) size() int {
  193. return len(w.str) + w.lhsize
  194. }
  195. func (w *encbuf) toBytes() []byte {
  196. out := make([]byte, w.size())
  197. strpos := 0
  198. pos := 0
  199. for _, head := range w.lheads {
  200. // write string data before header
  201. n := copy(out[pos:], w.str[strpos:head.offset])
  202. pos += n
  203. strpos += n
  204. // write the header
  205. enc := head.encode(out[pos:])
  206. pos += len(enc)
  207. }
  208. // copy string data after the last list header
  209. copy(out[pos:], w.str[strpos:])
  210. return out
  211. }
  212. func (w *encbuf) toWriter(out io.Writer) (err error) {
  213. strpos := 0
  214. for _, head := range w.lheads {
  215. // write string data before header
  216. if head.offset-strpos > 0 {
  217. n, err := out.Write(w.str[strpos:head.offset])
  218. strpos += n
  219. if err != nil {
  220. return err
  221. }
  222. }
  223. // write the header
  224. enc := head.encode(w.sizebuf[:])
  225. if _, err = out.Write(enc); err != nil {
  226. return err
  227. }
  228. }
  229. if strpos < len(w.str) {
  230. // write string data after the last list header
  231. _, err = out.Write(w.str[strpos:])
  232. }
  233. return err
  234. }
  235. // encReader is the io.Reader returned by EncodeToReader.
  236. // It releases its encbuf at EOF.
  237. type encReader struct {
  238. buf *encbuf // the buffer we're reading from. this is nil when we're at EOF.
  239. lhpos int // index of list header that we're reading
  240. strpos int // current position in string buffer
  241. piece []byte // next piece to be read
  242. }
  243. func (r *encReader) Read(b []byte) (n int, err error) {
  244. for {
  245. if r.piece = r.next(); r.piece == nil {
  246. // Put the encode buffer back into the pool at EOF when it
  247. // is first encountered. Subsequent calls still return EOF
  248. // as the error but the buffer is no longer valid.
  249. if r.buf != nil {
  250. encbufPool.Put(r.buf)
  251. r.buf = nil
  252. }
  253. return n, io.EOF
  254. }
  255. nn := copy(b[n:], r.piece)
  256. n += nn
  257. if nn < len(r.piece) {
  258. // piece didn't fit, see you next time.
  259. r.piece = r.piece[nn:]
  260. return n, nil
  261. }
  262. r.piece = nil
  263. }
  264. }
  265. // next returns the next piece of data to be read.
  266. // it returns nil at EOF.
  267. func (r *encReader) next() []byte {
  268. switch {
  269. case r.buf == nil:
  270. return nil
  271. case r.piece != nil:
  272. // There is still data available for reading.
  273. return r.piece
  274. case r.lhpos < len(r.buf.lheads):
  275. // We're before the last list header.
  276. head := r.buf.lheads[r.lhpos]
  277. sizebefore := head.offset - r.strpos
  278. if sizebefore > 0 {
  279. // String data before header.
  280. p := r.buf.str[r.strpos:head.offset]
  281. r.strpos += sizebefore
  282. return p
  283. }
  284. r.lhpos++
  285. return head.encode(r.buf.sizebuf[:])
  286. case r.strpos < len(r.buf.str):
  287. // String data at the end, after all list headers.
  288. p := r.buf.str[r.strpos:]
  289. r.strpos = len(r.buf.str)
  290. return p
  291. default:
  292. return nil
  293. }
  294. }
  295. var encoderInterface = reflect.TypeOf(new(Encoder)).Elem()
  296. // makeWriter creates a writer function for the given type.
  297. func makeWriter(typ reflect.Type, ts tags) (writer, error) {
  298. kind := typ.Kind()
  299. switch {
  300. case typ == rawValueType:
  301. return writeRawValue, nil
  302. case typ.AssignableTo(reflect.PtrTo(bigInt)):
  303. return writeBigIntPtr, nil
  304. case typ.AssignableTo(bigInt):
  305. return writeBigIntNoPtr, nil
  306. case kind == reflect.Ptr:
  307. return makePtrWriter(typ, ts)
  308. case reflect.PtrTo(typ).Implements(encoderInterface):
  309. return makeEncoderWriter(typ), nil
  310. case isUint(kind):
  311. return writeUint, nil
  312. case kind == reflect.Bool:
  313. return writeBool, nil
  314. case kind == reflect.String:
  315. return writeString, nil
  316. case kind == reflect.Slice && isByte(typ.Elem()):
  317. return writeBytes, nil
  318. case kind == reflect.Array && isByte(typ.Elem()):
  319. return makeByteArrayWriter(typ), nil
  320. case kind == reflect.Slice || kind == reflect.Array:
  321. return makeSliceWriter(typ, ts)
  322. case kind == reflect.Struct:
  323. return makeStructWriter(typ)
  324. case kind == reflect.Interface:
  325. return writeInterface, nil
  326. default:
  327. return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
  328. }
  329. }
  330. func writeRawValue(val reflect.Value, w *encbuf) error {
  331. w.str = append(w.str, val.Bytes()...)
  332. return nil
  333. }
  334. func writeUint(val reflect.Value, w *encbuf) error {
  335. w.encodeUint(val.Uint())
  336. return nil
  337. }
  338. func writeBool(val reflect.Value, w *encbuf) error {
  339. if val.Bool() {
  340. w.str = append(w.str, 0x01)
  341. } else {
  342. w.str = append(w.str, 0x80)
  343. }
  344. return nil
  345. }
  346. func writeBigIntPtr(val reflect.Value, w *encbuf) error {
  347. ptr := val.Interface().(*big.Int)
  348. if ptr == nil {
  349. w.str = append(w.str, 0x80)
  350. return nil
  351. }
  352. return writeBigInt(ptr, w)
  353. }
  354. func writeBigIntNoPtr(val reflect.Value, w *encbuf) error {
  355. i := val.Interface().(big.Int)
  356. return writeBigInt(&i, w)
  357. }
  358. // wordBytes is the number of bytes in a big.Word
  359. const wordBytes = (32 << (uint64(^big.Word(0)) >> 63)) / 8
  360. func writeBigInt(i *big.Int, w *encbuf) error {
  361. if i.Sign() == -1 {
  362. return fmt.Errorf("rlp: cannot encode negative *big.Int")
  363. }
  364. bitlen := i.BitLen()
  365. if bitlen <= 64 {
  366. w.encodeUint(i.Uint64())
  367. return nil
  368. }
  369. // Integer is larger than 64 bits, encode from i.Bits().
  370. // The minimal byte length is bitlen rounded up to the next
  371. // multiple of 8, divided by 8.
  372. length := ((bitlen + 7) & -8) >> 3
  373. w.encodeStringHeader(length)
  374. w.str = append(w.str, make([]byte, length)...)
  375. index := length
  376. buf := w.str[len(w.str)-length:]
  377. for _, d := range i.Bits() {
  378. for j := 0; j < wordBytes && index > 0; j++ {
  379. index--
  380. buf[index] = byte(d)
  381. d >>= 8
  382. }
  383. }
  384. return nil
  385. }
  386. func writeBytes(val reflect.Value, w *encbuf) error {
  387. w.encodeString(val.Bytes())
  388. return nil
  389. }
  390. var byteType = reflect.TypeOf(byte(0))
  391. func makeByteArrayWriter(typ reflect.Type) writer {
  392. length := typ.Len()
  393. if length == 0 {
  394. return writeLengthZeroByteArray
  395. } else if length == 1 {
  396. return writeLengthOneByteArray
  397. }
  398. if typ.Elem() != byteType {
  399. return writeNamedByteArray
  400. }
  401. return func(val reflect.Value, w *encbuf) error {
  402. writeByteArrayCopy(length, val, w)
  403. return nil
  404. }
  405. }
  406. func writeLengthZeroByteArray(val reflect.Value, w *encbuf) error {
  407. w.str = append(w.str, 0x80)
  408. return nil
  409. }
  410. func writeLengthOneByteArray(val reflect.Value, w *encbuf) error {
  411. b := byte(val.Index(0).Uint())
  412. if b <= 0x7f {
  413. w.str = append(w.str, b)
  414. } else {
  415. w.str = append(w.str, 0x81, b)
  416. }
  417. return nil
  418. }
  419. // writeByteArrayCopy encodes byte arrays using reflect.Copy. This is
  420. // the fast path for [N]byte where N > 1.
  421. func writeByteArrayCopy(length int, val reflect.Value, w *encbuf) {
  422. w.encodeStringHeader(length)
  423. offset := len(w.str)
  424. w.str = append(w.str, make([]byte, length)...)
  425. w.bufvalue.SetBytes(w.str[offset:])
  426. reflect.Copy(w.bufvalue, val)
  427. }
  428. // writeNamedByteArray encodes byte arrays with named element type.
  429. // This exists because reflect.Copy can't be used with such types.
  430. func writeNamedByteArray(val reflect.Value, w *encbuf) error {
  431. if !val.CanAddr() {
  432. // Slice requires the value to be addressable.
  433. // Make it addressable by copying.
  434. copy := reflect.New(val.Type()).Elem()
  435. copy.Set(val)
  436. val = copy
  437. }
  438. size := val.Len()
  439. slice := val.Slice(0, size).Bytes()
  440. w.encodeString(slice)
  441. return nil
  442. }
  443. func writeString(val reflect.Value, w *encbuf) error {
  444. s := val.String()
  445. if len(s) == 1 && s[0] <= 0x7f {
  446. // fits single byte, no string header
  447. w.str = append(w.str, s[0])
  448. } else {
  449. w.encodeStringHeader(len(s))
  450. w.str = append(w.str, s...)
  451. }
  452. return nil
  453. }
  454. func writeInterface(val reflect.Value, w *encbuf) error {
  455. if val.IsNil() {
  456. // Write empty list. This is consistent with the previous RLP
  457. // encoder that we had and should therefore avoid any
  458. // problems.
  459. w.str = append(w.str, 0xC0)
  460. return nil
  461. }
  462. eval := val.Elem()
  463. writer, err := cachedWriter(eval.Type())
  464. if err != nil {
  465. return err
  466. }
  467. return writer(eval, w)
  468. }
  469. func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) {
  470. etypeinfo := cachedTypeInfo1(typ.Elem(), tags{})
  471. if etypeinfo.writerErr != nil {
  472. return nil, etypeinfo.writerErr
  473. }
  474. writer := func(val reflect.Value, w *encbuf) error {
  475. if !ts.tail {
  476. defer w.listEnd(w.list())
  477. }
  478. vlen := val.Len()
  479. for i := 0; i < vlen; i++ {
  480. if err := etypeinfo.writer(val.Index(i), w); err != nil {
  481. return err
  482. }
  483. }
  484. return nil
  485. }
  486. return writer, nil
  487. }
  488. func makeStructWriter(typ reflect.Type) (writer, error) {
  489. fields, err := structFields(typ)
  490. if err != nil {
  491. return nil, err
  492. }
  493. for _, f := range fields {
  494. if f.info.writerErr != nil {
  495. return nil, structFieldError{typ, f.index, f.info.writerErr}
  496. }
  497. }
  498. writer := func(val reflect.Value, w *encbuf) error {
  499. lh := w.list()
  500. for _, f := range fields {
  501. if err := f.info.writer(val.Field(f.index), w); err != nil {
  502. return err
  503. }
  504. }
  505. w.listEnd(lh)
  506. return nil
  507. }
  508. return writer, nil
  509. }
  510. func makePtrWriter(typ reflect.Type, ts tags) (writer, error) {
  511. etypeinfo := cachedTypeInfo1(typ.Elem(), tags{})
  512. if etypeinfo.writerErr != nil {
  513. return nil, etypeinfo.writerErr
  514. }
  515. // Determine how to encode nil pointers.
  516. var nilKind Kind
  517. if ts.nilOK {
  518. nilKind = ts.nilKind // use struct tag if provided
  519. } else {
  520. nilKind = defaultNilKind(typ.Elem())
  521. }
  522. writer := func(val reflect.Value, w *encbuf) error {
  523. if val.IsNil() {
  524. if nilKind == String {
  525. w.str = append(w.str, 0x80)
  526. } else {
  527. w.listEnd(w.list())
  528. }
  529. return nil
  530. }
  531. return etypeinfo.writer(val.Elem(), w)
  532. }
  533. return writer, nil
  534. }
  535. func makeEncoderWriter(typ reflect.Type) writer {
  536. if typ.Implements(encoderInterface) {
  537. return func(val reflect.Value, w *encbuf) error {
  538. return val.Interface().(Encoder).EncodeRLP(w)
  539. }
  540. }
  541. w := func(val reflect.Value, w *encbuf) error {
  542. if !val.CanAddr() {
  543. // package json simply doesn't call MarshalJSON for this case, but encodes the
  544. // value as if it didn't implement the interface. We don't want to handle it that
  545. // way.
  546. return fmt.Errorf("rlp: unadressable value of type %v, EncodeRLP is pointer method", val.Type())
  547. }
  548. return val.Addr().Interface().(Encoder).EncodeRLP(w)
  549. }
  550. return w
  551. }
  552. // putint writes i to the beginning of b in big endian byte
  553. // order, using the least number of bytes needed to represent i.
  554. func putint(b []byte, i uint64) (size int) {
  555. switch {
  556. case i < (1 << 8):
  557. b[0] = byte(i)
  558. return 1
  559. case i < (1 << 16):
  560. b[0] = byte(i >> 8)
  561. b[1] = byte(i)
  562. return 2
  563. case i < (1 << 24):
  564. b[0] = byte(i >> 16)
  565. b[1] = byte(i >> 8)
  566. b[2] = byte(i)
  567. return 3
  568. case i < (1 << 32):
  569. b[0] = byte(i >> 24)
  570. b[1] = byte(i >> 16)
  571. b[2] = byte(i >> 8)
  572. b[3] = byte(i)
  573. return 4
  574. case i < (1 << 40):
  575. b[0] = byte(i >> 32)
  576. b[1] = byte(i >> 24)
  577. b[2] = byte(i >> 16)
  578. b[3] = byte(i >> 8)
  579. b[4] = byte(i)
  580. return 5
  581. case i < (1 << 48):
  582. b[0] = byte(i >> 40)
  583. b[1] = byte(i >> 32)
  584. b[2] = byte(i >> 24)
  585. b[3] = byte(i >> 16)
  586. b[4] = byte(i >> 8)
  587. b[5] = byte(i)
  588. return 6
  589. case i < (1 << 56):
  590. b[0] = byte(i >> 48)
  591. b[1] = byte(i >> 40)
  592. b[2] = byte(i >> 32)
  593. b[3] = byte(i >> 24)
  594. b[4] = byte(i >> 16)
  595. b[5] = byte(i >> 8)
  596. b[6] = byte(i)
  597. return 7
  598. default:
  599. b[0] = byte(i >> 56)
  600. b[1] = byte(i >> 48)
  601. b[2] = byte(i >> 40)
  602. b[3] = byte(i >> 32)
  603. b[4] = byte(i >> 24)
  604. b[5] = byte(i >> 16)
  605. b[6] = byte(i >> 8)
  606. b[7] = byte(i)
  607. return 8
  608. }
  609. }
  610. // intsize computes the minimum number of bytes required to store i.
  611. func intsize(i uint64) (size int) {
  612. for size = 1; ; size++ {
  613. if i >>= 8; i == 0 {
  614. return size
  615. }
  616. }
  617. }