encode.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. package rlp
  2. import (
  3. "fmt"
  4. "io"
  5. "math/big"
  6. "reflect"
  7. "sync"
  8. )
  9. var (
  10. // Common encoded values.
  11. // These are useful when implementing EncodeRLP.
  12. EmptyString = []byte{0x80}
  13. EmptyList = []byte{0xC0}
  14. )
  15. // Encoder is implemented by types that require custom
  16. // encoding rules or want to encode private fields.
  17. type Encoder interface {
  18. // EncodeRLP should write the RLP encoding of its receiver to w.
  19. // If the implementation is a pointer method, it may also be
  20. // called for nil pointers.
  21. //
  22. // Implementations should generate valid RLP. The data written is
  23. // not verified at the moment, but a future version might. It is
  24. // recommended to write only a single value but writing multiple
  25. // values or no value at all is also permitted.
  26. EncodeRLP(io.Writer) error
  27. }
  28. // ListSize returns the encoded size of an RLP list with the given
  29. // content size.
  30. func ListSize(contentSize uint64) uint64 {
  31. return uint64(headsize(contentSize)) + contentSize
  32. }
  33. // Encode writes the RLP encoding of val to w. Note that Encode may
  34. // perform many small writes in some cases. Consider making w
  35. // buffered.
  36. //
  37. // Encode uses the following type-dependent encoding rules:
  38. //
  39. // If the type implements the Encoder interface, Encode calls
  40. // EncodeRLP. This is true even for nil pointers, please see the
  41. // documentation for Encoder.
  42. //
  43. // To encode a pointer, the value being pointed to is encoded. For nil
  44. // pointers, Encode will encode the zero value of the type. A nil
  45. // pointer to a struct type always encodes as an empty RLP list.
  46. // A nil pointer to an array encodes as an empty list (or empty string
  47. // if the array has element type byte).
  48. //
  49. // Struct values are encoded as an RLP list of all their encoded
  50. // public fields. Recursive struct types are supported.
  51. //
  52. // To encode slices and arrays, the elements are encoded as an RLP
  53. // list of the value's elements. Note that arrays and slices with
  54. // element type uint8 or byte are always encoded as an RLP string.
  55. //
  56. // A Go string is encoded as an RLP string.
  57. //
  58. // An unsigned integer value is encoded as an RLP string. Zero always
  59. // encodes as an empty RLP string. Encode also supports *big.Int.
  60. //
  61. // An interface value encodes as the value contained in the interface.
  62. //
  63. // Boolean values are not supported, nor are signed integers, floating
  64. // point numbers, maps, channels and functions.
  65. func Encode(w io.Writer, val interface{}) error {
  66. if outer, ok := w.(*encbuf); ok {
  67. // Encode was called by some type's EncodeRLP.
  68. // Avoid copying by writing to the outer encbuf directly.
  69. return outer.encode(val)
  70. }
  71. eb := encbufPool.Get().(*encbuf)
  72. eb.reset()
  73. defer encbufPool.Put(eb)
  74. if err := eb.encode(val); err != nil {
  75. return err
  76. }
  77. return eb.toWriter(w)
  78. }
  79. // EncodeBytes returns the RLP encoding of val.
  80. // Please see the documentation of Encode for the encoding rules.
  81. func EncodeToBytes(val interface{}) ([]byte, error) {
  82. eb := encbufPool.Get().(*encbuf)
  83. eb.reset()
  84. defer encbufPool.Put(eb)
  85. if err := eb.encode(val); err != nil {
  86. return nil, err
  87. }
  88. return eb.toBytes(), nil
  89. }
  90. // EncodeReader returns a reader from which the RLP encoding of val
  91. // can be read. The returned size is the total size of the encoded
  92. // data.
  93. //
  94. // Please see the documentation of Encode for the encoding rules.
  95. func EncodeToReader(val interface{}) (size int, r io.Reader, err error) {
  96. eb := encbufPool.Get().(*encbuf)
  97. eb.reset()
  98. if err := eb.encode(val); err != nil {
  99. return 0, nil, err
  100. }
  101. return eb.size(), &encReader{buf: eb}, nil
  102. }
  103. type encbuf struct {
  104. str []byte // string data, contains everything except list headers
  105. lheads []*listhead // all list headers
  106. lhsize int // sum of sizes of all encoded list headers
  107. sizebuf []byte // 9-byte auxiliary buffer for uint encoding
  108. }
  109. type listhead struct {
  110. offset int // index of this header in string data
  111. size int // total size of encoded data (including list headers)
  112. }
  113. // encode writes head to the given buffer, which must be at least
  114. // 9 bytes long. It returns the encoded bytes.
  115. func (head *listhead) encode(buf []byte) []byte {
  116. return buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))]
  117. }
  118. // headsize returns the size of a list or string header
  119. // for a value of the given size.
  120. func headsize(size uint64) int {
  121. if size < 56 {
  122. return 1
  123. }
  124. return 1 + intsize(size)
  125. }
  126. // puthead writes a list or string header to buf.
  127. // buf must be at least 9 bytes long.
  128. func puthead(buf []byte, smalltag, largetag byte, size uint64) int {
  129. if size < 56 {
  130. buf[0] = smalltag + byte(size)
  131. return 1
  132. } else {
  133. sizesize := putint(buf[1:], size)
  134. buf[0] = largetag + byte(sizesize)
  135. return sizesize + 1
  136. }
  137. }
  138. // encbufs are pooled.
  139. var encbufPool = sync.Pool{
  140. New: func() interface{} { return &encbuf{sizebuf: make([]byte, 9)} },
  141. }
  142. func (w *encbuf) reset() {
  143. w.lhsize = 0
  144. if w.str != nil {
  145. w.str = w.str[:0]
  146. }
  147. if w.lheads != nil {
  148. w.lheads = w.lheads[:0]
  149. }
  150. }
  151. // encbuf implements io.Writer so it can be passed it into EncodeRLP.
  152. func (w *encbuf) Write(b []byte) (int, error) {
  153. w.str = append(w.str, b...)
  154. return len(b), nil
  155. }
  156. func (w *encbuf) encode(val interface{}) error {
  157. rval := reflect.ValueOf(val)
  158. ti, err := cachedTypeInfo(rval.Type(), tags{})
  159. if err != nil {
  160. return err
  161. }
  162. return ti.writer(rval, w)
  163. }
  164. func (w *encbuf) encodeStringHeader(size int) {
  165. if size < 56 {
  166. w.str = append(w.str, 0x80+byte(size))
  167. } else {
  168. // TODO: encode to w.str directly
  169. sizesize := putint(w.sizebuf[1:], uint64(size))
  170. w.sizebuf[0] = 0xB7 + byte(sizesize)
  171. w.str = append(w.str, w.sizebuf[:sizesize+1]...)
  172. }
  173. }
  174. func (w *encbuf) encodeString(b []byte) {
  175. if len(b) == 1 && b[0] <= 0x7F {
  176. // fits single byte, no string header
  177. w.str = append(w.str, b[0])
  178. } else {
  179. w.encodeStringHeader(len(b))
  180. w.str = append(w.str, b...)
  181. }
  182. }
  183. func (w *encbuf) list() *listhead {
  184. lh := &listhead{offset: len(w.str), size: w.lhsize}
  185. w.lheads = append(w.lheads, lh)
  186. return lh
  187. }
  188. func (w *encbuf) listEnd(lh *listhead) {
  189. lh.size = w.size() - lh.offset - lh.size
  190. if lh.size < 56 {
  191. w.lhsize += 1 // length encoded into kind tag
  192. } else {
  193. w.lhsize += 1 + intsize(uint64(lh.size))
  194. }
  195. }
  196. func (w *encbuf) size() int {
  197. return len(w.str) + w.lhsize
  198. }
  199. func (w *encbuf) toBytes() []byte {
  200. out := make([]byte, w.size())
  201. strpos := 0
  202. pos := 0
  203. for _, head := range w.lheads {
  204. // write string data before header
  205. n := copy(out[pos:], w.str[strpos:head.offset])
  206. pos += n
  207. strpos += n
  208. // write the header
  209. enc := head.encode(out[pos:])
  210. pos += len(enc)
  211. }
  212. // copy string data after the last list header
  213. copy(out[pos:], w.str[strpos:])
  214. return out
  215. }
  216. func (w *encbuf) toWriter(out io.Writer) (err error) {
  217. strpos := 0
  218. for _, head := range w.lheads {
  219. // write string data before header
  220. if head.offset-strpos > 0 {
  221. n, err := out.Write(w.str[strpos:head.offset])
  222. strpos += n
  223. if err != nil {
  224. return err
  225. }
  226. }
  227. // write the header
  228. enc := head.encode(w.sizebuf)
  229. if _, err = out.Write(enc); err != nil {
  230. return err
  231. }
  232. }
  233. if strpos < len(w.str) {
  234. // write string data after the last list header
  235. _, err = out.Write(w.str[strpos:])
  236. }
  237. return err
  238. }
  239. // encReader is the io.Reader returned by EncodeToReader.
  240. // It releases its encbuf at EOF.
  241. type encReader struct {
  242. buf *encbuf // the buffer we're reading from. this is nil when we're at EOF.
  243. lhpos int // index of list header that we're reading
  244. strpos int // current position in string buffer
  245. piece []byte // next piece to be read
  246. }
  247. func (r *encReader) Read(b []byte) (n int, err error) {
  248. for {
  249. if r.piece = r.next(); r.piece == nil {
  250. encbufPool.Put(r.buf)
  251. r.buf = nil
  252. return n, io.EOF
  253. }
  254. nn := copy(b[n:], r.piece)
  255. n += nn
  256. if nn < len(r.piece) {
  257. // piece didn't fit, see you next time.
  258. r.piece = r.piece[nn:]
  259. return n, nil
  260. }
  261. r.piece = nil
  262. }
  263. panic("not reached")
  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. } else {
  284. r.lhpos++
  285. return head.encode(r.buf.sizebuf)
  286. }
  287. case r.strpos < len(r.buf.str):
  288. // String data at the end, after all list headers.
  289. p := r.buf.str[r.strpos:]
  290. r.strpos = len(r.buf.str)
  291. return p
  292. default:
  293. return nil
  294. }
  295. }
  296. var (
  297. encoderInterface = reflect.TypeOf(new(Encoder)).Elem()
  298. big0 = big.NewInt(0)
  299. )
  300. // makeWriter creates a writer function for the given type.
  301. func makeWriter(typ reflect.Type) (writer, error) {
  302. kind := typ.Kind()
  303. switch {
  304. case typ.Implements(encoderInterface):
  305. return writeEncoder, nil
  306. case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(encoderInterface):
  307. return writeEncoderNoPtr, nil
  308. case kind == reflect.Interface:
  309. return writeInterface, nil
  310. case typ.AssignableTo(reflect.PtrTo(bigInt)):
  311. return writeBigIntPtr, nil
  312. case typ.AssignableTo(bigInt):
  313. return writeBigIntNoPtr, nil
  314. case isUint(kind):
  315. return writeUint, nil
  316. case kind == reflect.String:
  317. return writeString, nil
  318. case kind == reflect.Slice && isByte(typ.Elem()):
  319. return writeBytes, nil
  320. case kind == reflect.Array && isByte(typ.Elem()):
  321. return writeByteArray, nil
  322. case kind == reflect.Slice || kind == reflect.Array:
  323. return makeSliceWriter(typ)
  324. case kind == reflect.Struct:
  325. return makeStructWriter(typ)
  326. case kind == reflect.Ptr:
  327. return makePtrWriter(typ)
  328. default:
  329. return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
  330. }
  331. }
  332. func isByte(typ reflect.Type) bool {
  333. return typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface)
  334. }
  335. func writeUint(val reflect.Value, w *encbuf) error {
  336. i := val.Uint()
  337. if i == 0 {
  338. w.str = append(w.str, 0x80)
  339. } else if i < 128 {
  340. // fits single byte
  341. w.str = append(w.str, byte(i))
  342. } else {
  343. // TODO: encode int to w.str directly
  344. s := putint(w.sizebuf[1:], i)
  345. w.sizebuf[0] = 0x80 + byte(s)
  346. w.str = append(w.str, w.sizebuf[:s+1]...)
  347. }
  348. return nil
  349. }
  350. func writeBigIntPtr(val reflect.Value, w *encbuf) error {
  351. ptr := val.Interface().(*big.Int)
  352. if ptr == nil {
  353. w.str = append(w.str, 0x80)
  354. return nil
  355. }
  356. return writeBigInt(ptr, w)
  357. }
  358. func writeBigIntNoPtr(val reflect.Value, w *encbuf) error {
  359. i := val.Interface().(big.Int)
  360. return writeBigInt(&i, w)
  361. }
  362. func writeBigInt(i *big.Int, w *encbuf) error {
  363. if cmp := i.Cmp(big0); cmp == -1 {
  364. return fmt.Errorf("rlp: cannot encode negative *big.Int")
  365. } else if cmp == 0 {
  366. w.str = append(w.str, 0x80)
  367. } else {
  368. w.encodeString(i.Bytes())
  369. }
  370. return nil
  371. }
  372. func writeBytes(val reflect.Value, w *encbuf) error {
  373. w.encodeString(val.Bytes())
  374. return nil
  375. }
  376. func writeByteArray(val reflect.Value, w *encbuf) error {
  377. if !val.CanAddr() {
  378. // Slice requires the value to be addressable.
  379. // Make it addressable by copying.
  380. copy := reflect.New(val.Type()).Elem()
  381. copy.Set(val)
  382. val = copy
  383. }
  384. size := val.Len()
  385. slice := val.Slice(0, size).Bytes()
  386. w.encodeString(slice)
  387. return nil
  388. }
  389. func writeString(val reflect.Value, w *encbuf) error {
  390. s := val.String()
  391. if len(s) == 1 && s[0] <= 0x7f {
  392. // fits single byte, no string header
  393. w.str = append(w.str, s[0])
  394. } else {
  395. w.encodeStringHeader(len(s))
  396. w.str = append(w.str, s...)
  397. }
  398. return nil
  399. }
  400. func writeEncoder(val reflect.Value, w *encbuf) error {
  401. return val.Interface().(Encoder).EncodeRLP(w)
  402. }
  403. // writeEncoderNoPtr handles non-pointer values that implement Encoder
  404. // with a pointer receiver.
  405. func writeEncoderNoPtr(val reflect.Value, w *encbuf) error {
  406. if !val.CanAddr() {
  407. // We can't get the address. It would be possible make the
  408. // value addressable by creating a shallow copy, but this
  409. // creates other problems so we're not doing it (yet).
  410. //
  411. // package json simply doesn't call MarshalJSON for cases like
  412. // this, but encodes the value as if it didn't implement the
  413. // interface. We don't want to handle it that way.
  414. return fmt.Errorf("rlp: game over: unadressable value of type %v, EncodeRLP is pointer method", val.Type())
  415. }
  416. return val.Addr().Interface().(Encoder).EncodeRLP(w)
  417. }
  418. func writeInterface(val reflect.Value, w *encbuf) error {
  419. if val.IsNil() {
  420. // Write empty list. This is consistent with the previous RLP
  421. // encoder that we had and should therefore avoid any
  422. // problems.
  423. w.str = append(w.str, 0xC0)
  424. return nil
  425. }
  426. eval := val.Elem()
  427. ti, err := cachedTypeInfo(eval.Type(), tags{})
  428. if err != nil {
  429. return err
  430. }
  431. return ti.writer(eval, w)
  432. }
  433. func makeSliceWriter(typ reflect.Type) (writer, error) {
  434. etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})
  435. if err != nil {
  436. return nil, err
  437. }
  438. writer := func(val reflect.Value, w *encbuf) error {
  439. lh := w.list()
  440. vlen := val.Len()
  441. for i := 0; i < vlen; i++ {
  442. if err := etypeinfo.writer(val.Index(i), w); err != nil {
  443. return err
  444. }
  445. }
  446. w.listEnd(lh)
  447. return nil
  448. }
  449. return writer, nil
  450. }
  451. func makeStructWriter(typ reflect.Type) (writer, error) {
  452. fields, err := structFields(typ)
  453. if err != nil {
  454. return nil, err
  455. }
  456. writer := func(val reflect.Value, w *encbuf) error {
  457. lh := w.list()
  458. for _, f := range fields {
  459. if err := f.info.writer(val.Field(f.index), w); err != nil {
  460. return err
  461. }
  462. }
  463. w.listEnd(lh)
  464. return nil
  465. }
  466. return writer, nil
  467. }
  468. func makePtrWriter(typ reflect.Type) (writer, error) {
  469. etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})
  470. if err != nil {
  471. return nil, err
  472. }
  473. // determine nil pointer handler
  474. var nilfunc func(*encbuf) error
  475. kind := typ.Elem().Kind()
  476. switch {
  477. case kind == reflect.Array && isByte(typ.Elem().Elem()):
  478. nilfunc = func(w *encbuf) error {
  479. w.str = append(w.str, 0x80)
  480. return nil
  481. }
  482. case kind == reflect.Struct || kind == reflect.Array:
  483. nilfunc = func(w *encbuf) error {
  484. // encoding the zero value of a struct/array could trigger
  485. // infinite recursion, avoid that.
  486. w.listEnd(w.list())
  487. return nil
  488. }
  489. default:
  490. zero := reflect.Zero(typ.Elem())
  491. nilfunc = func(w *encbuf) error {
  492. return etypeinfo.writer(zero, w)
  493. }
  494. }
  495. writer := func(val reflect.Value, w *encbuf) error {
  496. if val.IsNil() {
  497. return nilfunc(w)
  498. } else {
  499. return etypeinfo.writer(val.Elem(), w)
  500. }
  501. }
  502. return writer, err
  503. }
  504. // putint writes i to the beginning of b in with big endian byte
  505. // order, using the least number of bytes needed to represent i.
  506. func putint(b []byte, i uint64) (size int) {
  507. switch {
  508. case i < (1 << 8):
  509. b[0] = byte(i)
  510. return 1
  511. case i < (1 << 16):
  512. b[0] = byte(i >> 8)
  513. b[1] = byte(i)
  514. return 2
  515. case i < (1 << 24):
  516. b[0] = byte(i >> 16)
  517. b[1] = byte(i >> 8)
  518. b[2] = byte(i)
  519. return 3
  520. case i < (1 << 32):
  521. b[0] = byte(i >> 24)
  522. b[1] = byte(i >> 16)
  523. b[2] = byte(i >> 8)
  524. b[3] = byte(i)
  525. return 4
  526. case i < (1 << 40):
  527. b[0] = byte(i >> 32)
  528. b[1] = byte(i >> 24)
  529. b[2] = byte(i >> 16)
  530. b[3] = byte(i >> 8)
  531. b[4] = byte(i)
  532. return 5
  533. case i < (1 << 48):
  534. b[0] = byte(i >> 40)
  535. b[1] = byte(i >> 32)
  536. b[2] = byte(i >> 24)
  537. b[3] = byte(i >> 16)
  538. b[4] = byte(i >> 8)
  539. b[5] = byte(i)
  540. return 6
  541. case i < (1 << 56):
  542. b[0] = byte(i >> 48)
  543. b[1] = byte(i >> 40)
  544. b[2] = byte(i >> 32)
  545. b[3] = byte(i >> 24)
  546. b[4] = byte(i >> 16)
  547. b[5] = byte(i >> 8)
  548. b[6] = byte(i)
  549. return 7
  550. default:
  551. b[0] = byte(i >> 56)
  552. b[1] = byte(i >> 48)
  553. b[2] = byte(i >> 40)
  554. b[3] = byte(i >> 32)
  555. b[4] = byte(i >> 24)
  556. b[5] = byte(i >> 16)
  557. b[6] = byte(i >> 8)
  558. b[7] = byte(i)
  559. return 8
  560. }
  561. }
  562. // intsize computes the minimum number of bytes required to store i.
  563. func intsize(i uint64) (size int) {
  564. for size = 1; ; size++ {
  565. if i >>= 8; i == 0 {
  566. return size
  567. }
  568. }
  569. panic("not reached")
  570. }