-
Notifications
You must be signed in to change notification settings - Fork 116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2922 michel codec doc #2972
2922 michel codec doc #2972
Changes from all commits
81f82f7
eab82bb
0259cdd
b1a2679
45223bd
a82b5cd
3b08821
bfd1f49
5d0a7cc
7b9d4c1
37e14e4
dc68be9
f259810
6fdda51
298b413
06af53b
e4853cf
fc2e2b0
a64564e
ae561ab
0a2974b
708d150
e018e9e
4523ffb
3c386ad
dffb59c
b58a460
8fa69af
a896a23
fd47258
00892e8
a39aaa5
82f5a89
bbaba4b
729c977
20e1521
daa592b
6010777
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
--- | ||
title: Michel Codec | ||
author: Hui-An Yang | ||
--- | ||
|
||
The `taquito/michel-codec` package converts and validates Michelson expressions between JSON-based Michelson and Micheline. It also comes with various functions like `packData`, `packDataBytes`, `unpackData` and `unpackDataBytes` to serialize any value of packable type to its optimized binary representation locally and vice versa, like Michelson instructions `PACK` and `UNPACK`. | ||
|
||
## Parser class | ||
To use the parser class, import and initialize it as follows. | ||
|
||
```ts | ||
import { Parser } from '@taquito/michel-codec' | ||
const p = new Parser() | ||
``` | ||
### Configuration | ||
You can configure the parser class by passing `ParserOptions` through initialization with `expandMacros` and `expandGlobalConstant` properties. | ||
|
||
* `expandMacros` - defaults to true unless you don't want `Parser` class to expand them; you can pass `{ expandMacros: false }` to disable it. ref: Expand [Michelson macros](https://tezos.gitlab.io/whitedoc/michelson.html#macros) during parsing | ||
* `expandGlobalConstant` - expects an object where the keys are global constant hashes and the values are the corresponding JSON Micheline expressions. | ||
|
||
for example | ||
|
||
```ts | ||
import { Parser } from '@taquito/michel-codec' | ||
|
||
const parserOptions: ParserOptions = { | ||
expandMacros: true, | ||
expandGlobalConstant: { | ||
'expr...': { prim: 'DROP', args: [{ int: '2' }] } | ||
} | ||
} | ||
const p = new Parser(parserOptions); | ||
``` | ||
|
||
### parseJSON & emitMicheline - Parse JSON Michelson and convert it to Micheline | ||
* `parseJSON` - takes a JSON-encoded Michelson, validates it, strips away unneeded properties and expands macros based on your configuration. | ||
* `emitMicheline` takes a parsed JSON Michelson object and converts it to a Micheline expression with formatting options. | ||
|
||
```js live noInline | ||
// import { Parser, emitMicheline } from '@taquito/michel-codec' | ||
|
||
const p = new Parser(); | ||
Tezos.contract | ||
.at("KT1BJadpDyLCACMH7Tt9xtpx4dQZVKw9cDF7") | ||
.then(contract => { | ||
const code = p.parseJSON(contract.script.code); | ||
println("Pretty print Michelson smart contract:"); | ||
println(emitMicheline(code, {indent:" ", newline: "\n",})); | ||
|
||
const storage = p.parseJSON(contract.script.storage); | ||
println("Pretty print Storage:"); | ||
println(emitMicheline(storage, {indent:" ", newline: "\n",})); | ||
}) | ||
.catch((error) => println(`Error: ${JSON.stringify(error, null, 2)}`)); | ||
``` | ||
|
||
### parseMichelineExpression - Parse Micheline and convert it to JSON Michelson | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here, remove 'parseMichelineExpression - ' |
||
Takes a Micheline expression in the form of script or data and converts it to JSON Michelson | ||
|
||
```js live noInline | ||
// import { Parser } from '@taquito/michel-codec' | ||
|
||
const p = new Parser(); | ||
|
||
const michelineScript = `{parameter unit; storage unit; code {CDR; NIL operation; PAIR};}` | ||
const script = p.parseMichelineExpression(michelineScript); | ||
println('JSON Michelson script: ' + JSON.stringify(script) + '\n'); | ||
|
||
const michelineData = `(IF_LEFT { IF_LEFT { SWAP ; SUB } { ADD } })`; | ||
const data = p.parseMichelineExpression(michelineData); | ||
println('JSON Michelson data: ' + JSON.stringify(data)); | ||
``` | ||
|
||
## PACK and UNPACK locally | ||
|
||
### packData & packDataBytes - Pack Michelson data | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||
Serialize any value of packable type to its optimized binary representation identical to the one used by PACK Michelson instructions. | ||
Without a type definition (not recommended), `packData` and `packDataBytes` will encode the data as a binary form of a generic Michelson expression. | ||
Type definition allows types like `timestamp`, `address` and other base58 representable types to be encoded to corresponding optimized binary forms borrowed from the Tezos protocol. | ||
|
||
```ts | ||
// import { packData, packDataBytes } from '@taquito/michel-codec' | ||
|
||
const data: MichelsonData = { string: 'KT1RvkwF4F7pz1gCoxkyZrG1RkrxQy3gmFTv%foo' }; | ||
const typ: MichelsonType = { prim: 'address' }; | ||
|
||
const packed = packData(data, typ); | ||
// 050a0000001901be41ee922ddd2cf33201e49d32da0afec571dce300666f6f | ||
|
||
const packedBytes = packDataBytes(data, typ); | ||
// { bytes: "050a0000001901be41ee922ddd2cf33201e49d32da0afec571dce300666f6f" } | ||
``` | ||
|
||
### unpackData & unpackDataBytes - Unpack Michelson data | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||
Deserialize a byte array into its corresponding Michelson value. | ||
Without a type definition (not recommended), the binary data will be treated as a binary form of a generic Michelson expression and returned as is. | ||
Type definition allows some types, like `timestamp` and `address` and others, usually encoded in optimized binary forms, to be transformed back to their string representations like base58 and ISO timestamps. | ||
|
||
```ts | ||
// import { unpackData, unpackDataBytes } from '@taquito/michel-codec' | ||
const type: MichelsonType = { prim: 'timestamp' }; | ||
|
||
const src1 = [0x05, 0x00, 0xa7, 0xe8, 0xe4, 0xd8, 0x0b]; | ||
const data1 = unpackData(src1, type); | ||
// { string: "2019-09-26T10:59:51Z" } | ||
|
||
const src2 = { bytes: '0500a7e8e4d80b' }; | ||
const data2 = unpackDataBytes(src2, type); | ||
// { string: "2019-09-26T10:59:51Z" } | ||
``` | ||
|
||
Alternatively, the same binary data without passing a type definition to `unpackData`, `unpackDataBytes` will not be deserialized correctly | ||
```ts | ||
// import { unpackData, unpackDataBytes } from '@taquito/michel-codec' | ||
|
||
const src1 = [0x05, 0x00, 0xa7, 0xe8, 0xe4, 0xd8, 0x0b]; | ||
const data1 = unpackData(src1); | ||
// { int: "1569495591" } | ||
|
||
const src2 = { bytes: '0500a7e8e4d80b' }; | ||
const data2 = unpackDataBytes(src2); | ||
// { int: "1569495591" } | ||
``` |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
redundant title, remove 'parseJSON & emitMicheline`
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
they are in place so the outline of the doc display the function names
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you listed them right below it, I would remove it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Heading titles for documentation should be concise and clear
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also having the title of methods as a preface to what it does is not a very good habit when writing technical documentation (it does work in some exceptions, but not in this case)
When writing a heading for a section, you want to explain what this section describes:
Parsing JSON Michelson and converting to Micheline
and then you would describe what methods to use in the content of said section
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i did some reading on writing technical docs outlines and it says it's good idea to have both method name with concise description and I also reference ethereum taquito equivalent tool docs, their outline have method name only. I think this is a preference and i decided to keep them.