encode.go 15 KB

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