{"id":18674082,"url":"https://github.com/nervosnetwork/ckb-types-go","last_synced_at":"2025-04-12T01:55:15.264Z","repository":{"id":97374572,"uuid":"217240822","full_name":"nervosnetwork/ckb-types-go","owner":"nervosnetwork","description":null,"archived":false,"fork":false,"pushed_at":"2019-11-04T07:46:35.000Z","size":3643,"stargazers_count":1,"open_issues_count":0,"forks_count":5,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-12T01:55:09.019Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nervosnetwork.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-10-24T07:42:28.000Z","updated_at":"2019-11-19T08:09:53.000Z","dependencies_parsed_at":"2023-05-02T18:32:38.030Z","dependency_job_id":null,"html_url":"https://github.com/nervosnetwork/ckb-types-go","commit_stats":null,"previous_names":["zeroqn/ckb-types-go"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-types-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-types-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-types-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-types-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nervosnetwork","download_url":"https://codeload.github.com/nervosnetwork/ckb-types-go/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248505869,"owners_count":21115354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T09:17:27.862Z","updated_at":"2025-04-12T01:55:15.243Z","avatar_url":"https://github.com/nervosnetwork.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ckb-types-go\n\n[![Actions Status](https://github.com/zeroqn/ckb-types-go/workflows/Go/badge.svg)](https://github.com/zeroqn/ckb-types-go/actions)\n\n### Note\n\nEncode `Transaction` will strip witnesses field, so that\nwe can properly calculate transaction hash.\n\n### example\n\n#### send capacity\n\n```go\npackage main\n\nimport (\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"github.com/ethereum/go-ethereum/crypto/secp256k1\"\n\t\"github.com/minio/blake2b-simd\"\n\tt \"github.com/nervosnetwork/ckb-types-go/jsonrpc/types\"\n\t\"github.com/ybbus/jsonrpc\"\n)\n\n// from spec/dev.toml\n// # issue 10M cell for random generated private key: d00c06bfd800d27397002dca6fb0993d5ba6399b4238b2f29ee9deb97593d2bc\n// [[genesis.issued_cells]]\n// capacity = 10_000_000_00000000\n// lock.code_hash = \"0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8\"\n// lock.args = \"0xc8328aabcd9b9e8e64fbc566c4385c3bdeb219d7\"\n// lock.hash_type = \"type\"\n//\n// # issue 5M cell for random generated private key: 63d86723e08f0f813a36ce6aa123bb2289d90680ae1e99d4de8cdb334553f24d\n// [[genesis.issued_cells]]\n// capacity = 5_000_000_00000000\n// lock.code_hash = \"0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8\"\n// lock.args = \"0x470dcdc5e44064909650113a274b3b36aecb6dc7\"\n// lock.hash_type = \"type\"\n\n// CkbBlake2BHashPersonalization personal\nconst CkbBlake2BHashPersonalization = \"ckb-default-hash\"\n\n// GenesisBlockHash genesis block hash\nconst GenesisBlockHash = \"0x73f4ffa1d7898c2c044326363ba8d59fd123e173ff2d5c4d187d29baaae6214e\"\n\n// BobAddress bob address\nconst BobAddress = \"0xc8328aabcd9b9e8e64fbc566c4385c3bdeb219d7\"\n\n// BobSecKey bob private key\nconst BobSecKey = \"d00c06bfd800d27397002dca6fb0993d5ba6399b4238b2f29ee9deb97593d2bc\"\n\n// AliceAddress Alice address\nconst AliceAddress = \"0x470dcdc5e44064909650113a274b3b36aecb6dc7\"\n\n// SystemCellLockCodeHash system cell lock code hash\nconst SystemCellLockCodeHash = \"0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8\"\n\n// M5 5 millions\nconst M5 = \"0x1c6bf52634000\"\n\n// M49 4.9 millions\nconst M49 = \"0x1bda703f0a000\"\n\n// M10 10 millions\nconst M10 = \"0x38d7ea4c68000\"\n\n// RPCResultTransaction transaction response from jsonrpc\ntype RPCResultTransaction struct {\n\tVersion     t.Uint32       `json:\"version\"`\n\tHash        string         `json:\"hash\"`\n\tCellDeps    []t.CellDep    `json:\"cell_deps\"`\n\tHeaderDeps  []t.Hash       `json:\"header_deps\"`\n\tInputs      []t.CellInput  `json:\"inputs\"`\n\tOutputs     []t.CellOutput `json:\"outputs\"`\n\tWitnesses   []t.Bytes      `json:\"witnesses\"`\n\tOutputsData []t.Bytes      `json:\"outputs_data\"`\n}\n\n// RPCResultBlock block response from jsonrpc\ntype RPCResultBlock struct {\n\tHeader       t.Header               `json:\"header\"`\n\tProposals    []t.ProposalShortID    `json:\"proposals\"`\n\tTransactions []RPCResultTransaction `json:\"transactions\"`\n\tUncles       []t.UncleBlock         `json:\"uncles\"`\n}\n\nfunc main() {\n\trpcClient := jsonrpc.NewClient(\"http://127.0.0.1:8114\")\n\n\tresp, err := rpcClient.Call(\"get_block\", GenesisBlockHash)\n\tif err != nil {\n\t\tfmt.Printf(\"Err %v\", err)\n\t\treturn\n\t}\n\n\tgenesisBlock := new(RPCResultBlock)\n\n\terr = resp.GetObject(\u0026genesisBlock)\n\tif err != nil || genesisBlock == nil {\n\t\tfmt.Printf(\"Unmarsh json genesisBlock fail: %v\", err)\n\t}\n\n\tif genesisBlock.Transactions[0].Outputs[6].Lock.Args != BobAddress {\n\t\tfmt.Println(\"Genesis bob address changed\")\n\t\treturn\n\t}\n\n\tif genesisBlock.Transactions[0].Outputs[7].Lock.Args != AliceAddress {\n\t\tfmt.Println(\"Genesis alice address changed\")\n\t\treturn\n\t}\n\n\t// We try to transfer 5M from bob to alice\n\n\t// Calc cell deps\n\tsecpDepGroup := genesisBlock.Transactions[1].Hash\n\toutpoint := t.OutPoint{\n\t\tTxHash: t.Hash(secpDepGroup),\n\t\tIndex:  \"0x0\",\n\t}\n\n\tcellDep := t.CellDep{\n\t\tOutPoint: outpoint,\n\t\tDepType:  t.DepGroup,\n\t}\n\n\t// Calc input\n\tbobPrevOutPoint := t.OutPoint{\n\t\tTxHash: t.Hash(genesisBlock.Transactions[0].Hash),\n\t\tIndex:  \"0x6\",\n\t}\n\n\tbobInput := t.CellInput{\n\t\tPreviousOutput: bobPrevOutPoint,\n\t\tSince:          \"0x0\",\n\t}\n\n\t// Calc outputs\n\taliceScript := t.Script{\n\t\tArgs:     AliceAddress,\n\t\tCodeHash: SystemCellLockCodeHash,\n\t\tHashType: t.Type,\n\t}\n\n\taliceOutput := t.CellOutput{\n\t\tCapacity: M5,\n\t\tLock:     aliceScript,\n\t\tType:     nil,\n\t}\n\n\tbobScript := t.Script{\n\t\tArgs:     BobAddress,\n\t\tCodeHash: SystemCellLockCodeHash,\n\t\tHashType: t.Type,\n\t}\n\n\tbobOutput := t.CellOutput{\n\t\tCapacity: M49,\n\t\tLock:     bobScript,\n\t\tType:     nil,\n\t}\n\n\t// Assemble transaction\n\ttx := t.Transaction{\n\t\tVersion:     \"0x0\",\n\t\tCellDeps:    []t.CellDep{cellDep},\n\t\tHeaderDeps:  make([]t.Hash, 0),\n\t\tInputs:      []t.CellInput{bobInput},\n\t\tOutputs:     []t.CellOutput{aliceOutput, bobOutput},\n\t\tWitnesses:   make([]t.Bytes, 0),\n\t\tOutputsData: []t.Bytes{\"0x\", \"0x\"},\n\t}\n\n\t// Cacl witness\n\n\t// Serialize transaction\n\ttxBlob, err := tx.Serialize()\n\tif err != nil {\n\t\tfmt.Printf(\"Encode failure: %s\", err)\n\t\treturn\n\t}\n\n\t// Prepare hash\n\tconfig := \u0026blake2b.Config{\n\t\tSize:   32,\n\t\tPerson: []byte(CkbBlake2BHashPersonalization),\n\t}\n\th, err := blake2b.New(config)\n\tif err != nil {\n\t\tfmt.Printf(\"Initial blake2b hash failure, %s\\n\", err)\n\t\treturn\n\t}\n\n\t// Hash tx\n\th.Write(txBlob)\n\ttxHash := h.Sum(nil)\n\n\t// Calc witness args\n\t// 65 is secp256k1 signature length\n\tlock := hex.EncodeToString(make([]byte, 65))\n\twitnessLock := t.Bytes(fmt.Sprintf(\"0x%s\", lock))\n\twa := t.WitnessArgs{\n\t\tLock: \u0026witnessLock,\n\t}\n\n\twab, err := wa.Serialize()\n\tif err != nil {\n\t\tfmt.Printf(\"Serialize witness args failure, %s\\n\", err)\n\t\treturn\n\t}\n\n\twabLen := make([]byte, 8)\n\tbinary.LittleEndian.PutUint64(wabLen, uint64(len(wab)))\n\n\t// Hash again\n\th.Reset()\n\th.Write(txHash)\n\th.Write(wabLen)\n\th.Write(wab)\n\twitnessMessage := h.Sum(nil)\n\n\t// Sign witness message\n\tbobSecKey := make([]byte, 32)\n\t_, err = hex.Decode(bobSecKey, []byte(BobSecKey))\n\tif err != nil {\n\t\tfmt.Println(\"Invalid bob private key\")\n\t\treturn\n\t}\n\n\twitnessSig, err := secp256k1.Sign(witnessMessage[:], bobSecKey)\n\tif err != nil {\n\t\tfmt.Printf(\"Calc witness failure: %s\\n\", err)\n\t\treturn\n\t}\n\n\t// Hex witness signature\n\t// 130 is hexed secp256k1 with recoverable public length\n\twitness := make([]byte, 130)\n\thex.Encode(witness, witnessSig[:])\n\n\t// Refill witness args\n\twitnessLock = t.Bytes(fmt.Sprintf(\"0x%s\", witness))\n\twa = t.WitnessArgs{\n\t\tLock: \u0026witnessLock,\n\t}\n\n\t// Serialize witness args\n\twitness, err = wa.Serialize()\n\tif err != nil {\n\t\tfmt.Printf(\"witness serialize failure: %s\\n\", err)\n\t\treturn\n\t}\n\n\t// Update transaction with witness\n\ttx.Witnesses = []t.Bytes{t.Bytes(fmt.Sprintf(\"0x%s\", hex.EncodeToString(witness)))}\n\n\tresp, err = rpcClient.Call(\"send_transaction\", []*t.Transaction{\u0026tx})\n\tif err != nil {\n\t\tfmt.Printf(\"Err %v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"transfer response %v\", resp)\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnervosnetwork%2Fckb-types-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnervosnetwork%2Fckb-types-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnervosnetwork%2Fckb-types-go/lists"}