{"id":18674118,"url":"https://github.com/nervosnetwork/ckb-sdk-rust","last_synced_at":"2025-08-22T00:32:10.835Z","repository":{"id":37096017,"uuid":"462199862","full_name":"nervosnetwork/ckb-sdk-rust","owner":"nervosnetwork","description":"Rust SDK for Nervos CKB","archived":false,"fork":false,"pushed_at":"2024-04-13T08:55:35.000Z","size":2280,"stargazers_count":17,"open_issues_count":23,"forks_count":24,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-04-14T09:19:14.991Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","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":"CHANGELOG.md","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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-22T08:12:47.000Z","updated_at":"2024-05-13T02:37:36.803Z","dependencies_parsed_at":"2023-12-14T10:42:19.399Z","dependency_job_id":"398dd83f-6593-4951-a972-49fba41d8a15","html_url":"https://github.com/nervosnetwork/ckb-sdk-rust","commit_stats":{"total_commits":268,"total_committers":5,"mean_commits":53.6,"dds":0.4328358208955224,"last_synced_commit":"5f7aa5a5024d57c9d9619b72b15b5c1f13ddc745"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-sdk-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-sdk-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-sdk-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nervosnetwork%2Fckb-sdk-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nervosnetwork","download_url":"https://codeload.github.com/nervosnetwork/ckb-sdk-rust/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230542288,"owners_count":18242332,"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:34.263Z","updated_at":"2025-08-22T00:32:10.820Z","avatar_url":"https://github.com/nervosnetwork.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# CKB SDK Rust\n\nThe Rust SDK for Nervos [CKB][ckb] provides several essential features for developers:\n\n- RPC access to CKB nodes\n- Data structure definitions for various concepts within CKB\n- Support for assembling CKB transactions\n- Signature unlocking support for commonly used [lock scripts](https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0022-transaction-structure/0022-transaction-structure.md#lock-script).\n\nThese features allow for seamless interaction with CKB and facilitate the development of decentralized applications on the CKB network.\n\n## Install\n\n```toml\n# Cargo.toml\n[dependencies]\nckb-sdk = \"4.1.0\"\n```\n\n## Build\n\nBuild:\n\n```bash\ncargo build\n```\n\nRun unit tests:\n\n```\nmake test\n```\n\nPlease refer to the [Makefile](./Makefile) for more compilation commands.\n\n## Quick start\n\n### Setup\n\nckb-sdk-rust provides a convenient client that enables you to easily interact with CKB nodes.\n\n```rust\nuse ckb_sdk::rpc::CkbRpcClient;\n\nlet mut ckb_client = CkbRpcClient::new(\"https://testnet.ckb.dev\");\nlet block = ckb_client.get_block_by_number(0.into()).unwrap();\nprintln!(\"block: {}\", serde_json::to_string_pretty(\u0026block).unwrap());\n```\n\nFor more details about CKB RPC APIs, please refer to the [CKB RPC doc](https://github.com/nervosnetwork/ckb/blob/master/rpc/README.md).\n\n### Build transaction by manual\n\nThe following code example demonstrates how to construct a transfer transaction on CKB. You can use it to transfer a specified amount of CKB from one address to another.\n\n**NOTE**: The address and key are for demo purposes only and should not be used in a production environment.\n\n```rust\nuse ckb_sdk::{\n    constants::SIGHASH_TYPE_HASH,\n    rpc::CkbRpcClient,\n    traits::{\n        DefaultCellCollector, DefaultCellDepResolver, DefaultHeaderDepResolver,\n        DefaultTransactionDependencyProvider, SecpCkbRawKeySigner,\n    },\n    tx_builder::{transfer::CapacityTransferBuilder, CapacityBalancer, TxBuilder},\n    unlock::{ScriptUnlocker, SecpSighashUnlocker},\n    Address, HumanCapacity, ScriptId,\n};\nuse ckb_types::{\n    bytes::Bytes,\n    core::BlockView,\n    h256,\n    packed::{CellOutput, Script, WitnessArgs},\n    prelude::*,\n};\nuse std::{collections::HashMap, str::FromStr};\n\n// Prepare the necessary data for a CKB transaction:\n//   * set the RPC endpoint for the testnet\n//   * define the sender's address and secret key\n//   * define the recipient's address\n//   * specify the capacity to transfer\nlet ckb_rpc = \"https://testnet.ckb.dev:8114\";\nlet sender = Address::from_str(\"ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqf7v2xsyj0p8szesqrwqapvvygpc8hzg9sku954v\").unwrap();\nlet sender_key = secp256k1::SecretKey::from_slice(\n    h256!(\"0xef4dfe655b3df20838bdd16e20afc70dfc1b9c3e87c54c276820315a570e6555\").as_bytes(),\n)\n.unwrap();\nlet receiver = Address::from_str(\"ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqvglkprurm00l7hrs3rfqmmzyy3ll7djdsujdm6z\").unwrap();\nlet capacity = HumanCapacity::from_str(\"100.0\").unwrap();\n\n // Build ScriptUnlocker\nlet signer = SecpCkbRawKeySigner::new_with_secret_keys(vec![sender_key]);\nlet sighash_unlocker = SecpSighashUnlocker::from(Box::new(signer) as Box\u003c_\u003e);\nlet sighash_script_id = ScriptId::new_type(SIGHASH_TYPE_HASH.clone());\nlet mut unlockers = HashMap::default();\nunlockers.insert(\n    sighash_script_id,\n    Box::new(sighash_unlocker) as Box\u003cdyn ScriptUnlocker\u003e,\n);\n\n// Build CapacityBalancer\nlet placeholder_witness = WitnessArgs::new_builder()\n    .lock(Some(Bytes::from(vec![0u8; 65])).pack())\n    .build();\nlet balancer = CapacityBalancer::new_simple(sender.payload().into(), placeholder_witness, 1000);\n\n// Build:\n//   * CellDepResolver\n//   * HeaderDepResolver\n//   * CellCollector\n//   * TransactionDependencyProvider\nlet mut ckb_client = CkbRpcClient::new(ckb_rpc);\nlet cell_dep_resolver = {\n    let genesis_block = ckb_client.get_block_by_number(0.into()).unwrap().unwrap();\n    DefaultCellDepResolver::from_genesis(\u0026BlockView::from(genesis_block)).unwrap()\n};\nlet header_dep_resolver = DefaultHeaderDepResolver::new(ckb_rpc);\nlet mut cell_collector = DefaultCellCollector::new(ckb_rpc);\nlet tx_dep_provider = DefaultTransactionDependencyProvider::new(ckb_rpc, 10);\n\n// Build the transaction\nlet output = CellOutput::new_builder()\n    .lock(Script::from(\u0026receiver))\n    .capacity(capacity.0.pack())\n    .build();\nlet builder = CapacityTransferBuilder::new(vec![(output, Bytes::default())]);\nlet (_tx, _) = builder\n    .build_unlocked(\n        \u0026mut cell_collector,\n        \u0026cell_dep_resolver,\n        \u0026header_dep_resolver,\n        \u0026tx_dep_provider,\n        \u0026balancer,\n        \u0026unlockers,\n    )\n    .unwrap();\n```\n\n### Generate a new address\n\nIn CKB, a private key can be used to generate a public key, which is then hashed using the Blake2b hashing algorithm to produce a CKB address. The public key is derived from the private key using the secp256k1 elliptic curve cryptography algorithm. This process results in a unique CKB address that can be used to receive or send CKB tokens. It is important to keep the private key secure, as anyone with access to it can potentially access the associated CKB funds.\n\n```rust\nuse ckb_sdk::types::{Address, AddressPayload, NetworkType};\nuse rand::Rng;\n\nlet mut rng = rand::thread_rng();\nlet privkey_bytes: [u8; 32] = rng.gen();\nlet secp_secret_key = secp256k1::SecretKey::from_slice(\u0026privkey_bytes).unwrap();\nlet pubkey =\n    secp256k1::PublicKey::from_secret_key(\u0026ckb_crypto::secp::SECP256K1, \u0026secp_secret_key);\nlet payload = AddressPayload::from_pubkey(\u0026pubkey);\nlet address = Address::new(NetworkType::Mainnet, payload, true);\nprintln!(\"address: {}\", address.to_string());\n```\n\n### Parse address\n\nIn the world of CKB, a lock script can be represented as an address. It is possible to parse an address from an encoded string and then obtain its network and script.\n\n```rust\nuse ckb_sdk::types::Address;\nuse ckb_types::packed::Script;\nuse std::str::FromStr;\n\nlet addr_str = \"ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqgvf0k9sc40s3azmpfvhyuudhahpsj72tsr8cx3d\";\nlet addr = Address::from_str(addr_str).unwrap();\nlet _network = addr.network();\nlet _script: Script = addr.payload().into();\n```\n\nFor more details please about CKB address refer to [CKB rfc 0021](https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0021-ckb-address-format/0021-ckb-address-format.md).\n\n\n## More Examples\n\n* [`transfer_from_sighash.rs`](examples/transfer_from_sighash.rs) Transfer capacity from a sighash address\n* [`transfer_from_multisig.rs`](examples/transfer_from_multisig.rs) Transfer capacity from a multisig address (main logic is less than 60 lines of code)\n\nYou can try compiling them by running the following command in your terminal:\n\n```sh\ncargo build --examples\n```\n\nFor more use cases of building transactions with CKB node, please refer to [these examples](./examples/) and [unit tests](./src/tests/).\n\n## Wasm\n\n`ckb-sdk-rust` has limited support for `wasm32-unknown-unknown`. Some trait are not implemented on `wasm32`, such as `impl CellDataProvider for \u0026dyn TransactionDependencyProvider`. To use on wasm, default features must be disabled\n\n## License\n\nThe SDK is available as open source under the terms of the [MIT License](./LICENSE).\n\n## ChangeLog\n\nSee [CHANGELOG](CHANGELOG.md) for more details.\n\n\n[ckb]: https://github.com/nervosnetwork/ckb\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnervosnetwork%2Fckb-sdk-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnervosnetwork%2Fckb-sdk-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnervosnetwork%2Fckb-sdk-rust/lists"}