├── README.md ├── Move.md ├── Solidity.md ├── Vyper.md └── Rust.md /README.md: -------------------------------------------------------------------------------- 1 | ## 智能合约 2 | 智能合约是一种运行在区块链上的计算机程序,它能够自动执行、验证和执行合约条款。智能合约最早由密码学家Nick Szabo在1994年提出,但直到以太坊(Ethereum)的出现才真正实现。 3 | 4 | 智能合约的工作原理如下: 5 | 1. **编写和部署**:首先,开发者会使用特定的编程语言(如Solidity)编写智能合约,并将其部署到区块链上。 6 | 7 | 2. **触发条件**:智能合约包含一系列的规则和条件。当这些条件被满足时,智能合约就会被触发。 8 | 9 | 3. **自动执行**:一旦触发,智能合约会自动执行预定的操作,无需任何人工干预。 10 | 11 | 4. **不可更改和透明**:一旦智能合约被部署到区块链上,就无法被修改或删除。此外,所有的交易都是公开透明的,任何人都可以查看。 12 | 13 | 智能合约在许多领域都有广泛的应用,包括金融服务、供应链管理、版权保护、投票系统等。 14 | 15 | ## 1、智能合约的主流编程语言主要有以下几种: 16 | 17 | 1. **Solidity**:这是以太坊智能合约的主要编程语言。它是一种静态类型语言,具有与JavaScript类似的语法,使其对Web开发人员来说易于学习和使用。 18 | 19 | 2. **Vyper**:这是另一种以太坊智能合约编程语言,旨在使代码更易于理解和审计。它的语法类似于Python。 20 | 21 | 3. **Chaincode**:这是Hyperledger Fabric(一个开源区块链平台)的智能合约编程语言。Chaincode可以用Go,JavaScript或TypeScript编写。 22 | 23 | 4. **Rust 和 Ink!**:这是用于Polkadot和Substrate框架的智能合约开发的语言和工具集。 24 | 25 | 5. **Michelson**:这是Tezos区块链的智能合约语言。它是一种低级堆栈语言,类似于比特币的Script。 26 | 27 | 6. **Move**:这是Libra(现在称为Diem)区块链的智能合约语言。Move的设计目标是为了提供安全性和可预测性。 28 | 29 | 7. **Simplicity**:这是用于比特币和其他区块链的智能合约语言。Simplicity是一种低级语言,旨在提供最大的安全性和可分析性。 30 | 31 | 8. **Scilla**:这是Zilliqa区块链的智能合约语言。Scilla的设计目标是为了提供更高的安全性和更好的形式化验证。 32 | 33 | 以上就是目前主流的智能合约编程语言,选择哪种语言取决于你的具体需求和你使用的区块链平台。 34 | 35 | 36 | ### 2. 核心特点 37 | 38 | - **自动执行**:一旦满足预设条件,合约将自动执行,无需人工干预 39 | - **不可篡改**:部署到区块链后,代码无法被修改 40 | - **透明性**:所有交易和合约状态都是公开可查的 41 | - **去中心化**:不依赖任何中心化机构 42 | - **确定性**:相同的输入总是产生相同的输出 43 | ### 3. 主要应用场景 44 | - **去中心化金融(DeFi)**:借贷、交易、保险等 45 | - **数字资产**:代币发行、NFT 46 | - **供应链管理**:追踪商品流转 47 | - **投票系统**:透明、不可篡改的投票机制 48 | - **身份认证**:去中心化身份管理 49 | 50 | ### 4. 安全考虑 51 | - **重入攻击**:确保状态更新在外部调用之前 52 | - **整数溢出**:使用SafeMath库 53 | - **权限控制**:正确设置访问控制 54 | - **Gas优化**:减少不必要的计算和存储 55 | - **代码审计**:部署前进行专业审计 56 | 57 | ### 5. 智能合约示例 58 | ```solidity 59 | // 一个简单的代币合约示例 60 | contract SimpleToken { 61 | mapping(address => uint256) public balances; 62 | string public name = "Simple Token"; 63 | string public symbol = "ST"; 64 | 65 | // 铸造新代币 66 | function mint(address to, uint256 amount) public { 67 | balances[to] += amount; 68 | } 69 | 70 | // 转账 71 | function transfer(address to, uint256 amount) public { 72 | require(balances[msg.sender] >= amount, "Insufficient balance"); 73 | balances[msg.sender] -= amount; 74 | balances[to] += amount; 75 | } 76 | } 77 | ``` 78 | ### 6. 开发工具 79 | - **Remix**:在线IDE 80 | - **Truffle**:开发框架 81 | - **Hardhat**:开发环境 82 | - **OpenZeppelin**:安全合约库 83 | - **Etherscan**:合约验证和浏览 84 | ### 7. 部署流程 85 | 1. 编写合约代码 86 | 2. 编译合约 87 | 3. 测试合约 88 | 4. 部署到测试网 89 | 5. 安全审计 90 | 6. 部署到主网 91 | ### 9. 局限性 92 | - **不可升级**:部署后难以修改 93 | - **Gas成本**:执行需要支付费用 94 | - **性能限制**:受限于区块链性能 95 | - **复杂性**:开发难度较大 96 | - **法律地位**:部分国家法律地位不明确 97 | 98 | 99 | -------------------------------------------------------------------------------- /Move.md: -------------------------------------------------------------------------------- 1 | ## Move 2 | ### 1. 开发环境搭建 3 | 4 | 1. **安装 Move CLI** 5 | ```bash 6 | # 安装 Move CLI (以 Aptos 为例) 7 | cargo install --git https://github.com/aptos-labs/aptos-core.git aptos 8 | ``` 9 | 10 | 2. **创建新项目** 11 | ```bash 12 | # 创建新的 Move 项目 13 | aptos move init --name my_project 14 | ``` 15 | 16 | ### 2. 项目结构 17 | 典型的 Move 项目结构如下: 18 | ``` 19 | my_project/ 20 | ├── Move.toml # 项目配置文件 21 | ├── sources/ # 源代码目录 22 | │ └── main.move # 主合约文件 23 | └── tests/ # 测试文件目录 24 | ``` 25 | 26 | ### 3. 编写合约 27 | 示例合约 `main.move`: 28 | ``` 29 | module my_project::main { 30 | use std::signer; 31 | 32 | struct Counter has key { 33 | value: u64 34 | } 35 | 36 | public fun initialize(account: &signer) { 37 | move_to(account, Counter { value: 0 }); 38 | } 39 | 40 | public fun increment(account: &signer) acquires Counter { 41 | let counter = borrow_global_mut(signer::address_of(account)); 42 | counter.value = counter.value + 1; 43 | } 44 | 45 | public fun get_value(account: &signer): u64 acquires Counter { 46 | borrow_global(signer::address_of(account)).value 47 | } 48 | } 49 | ``` 50 | 51 | ### 4. 编译合约 52 | 53 | ```bash 54 | # 编译合约 55 | aptos move compile 56 | ``` 57 | 58 | ### 5. 测试合约 59 | 1. **编写测试** 60 | ```move 61 | #[test(account = @0x1)] 62 | fun test_increment(account: &signer) { 63 | initialize(account); 64 | increment(account); 65 | assert!(get_value(account) == 1, 0); 66 | } 67 | ``` 68 | 69 | 2. **运行测试** 70 | ```bash 71 | aptos move test 72 | ``` 73 | 74 | ### 6. 部署合约 75 | 1. **配置网络** 76 | ```bash 77 | # 设置测试网 78 | aptos config set-global-config --config-type testnet 79 | ``` 80 | 81 | 2. **创建账户** 82 | ```bash 83 | # 创建新账户 84 | aptos account create 85 | ``` 86 | 87 | 3. **部署合约** 88 | ```bash 89 | # 部署合约到测试网 90 | aptos move publish --named-addresses my_project=0x123 91 | ``` 92 | 93 | ### 7. 与合约交互 94 | 1. **调用合约函数** 95 | ```bash 96 | # 调用 initialize 函数 97 | aptos move run --function-id 0x123::main::initialize 98 | 99 | # 调用 increment 函数 100 | aptos move run --function-id 0x123::main::increment 101 | ``` 102 | 103 | ### 8. 最佳实践 104 | 1. **安全性考虑** 105 | - 使用 `signer` 类型验证调用者身份 106 | - 实现适当的访问控制 107 | - 进行充分的错误处理 108 | 2. **性能优化** 109 | - 最小化存储操作 110 | - 使用批量操作 111 | - 避免不必要的计算 112 | 3. **代码组织** 113 | - 模块化设计 114 | - 清晰的文档注释 115 | - 完整的测试覆盖 116 | ### 9. 调试和监控 117 | 1. **查看交易** 118 | ```bash 119 | # 查看交易详情 120 | aptos transaction show 121 | ``` 122 | 123 | 2. **查看账户状态** 124 | ```bash 125 | # 查看账户资源 126 | aptos account list --account 0x123 127 | ``` 128 | 129 | ### 10. 常见问题解决 130 | 1. **编译错误** 131 | - 检查 Move.toml 配置 132 | - 确保依赖项正确 133 | - 验证语法错误 134 | 2. **部署错误** 135 | - 检查账户余额 136 | - 验证网络连接 137 | - 确认权限设置 138 | 3. **运行时错误** 139 | - 检查资源访问权限 140 | - 验证函数参数 141 | - 确认前置条件 142 | -------------------------------------------------------------------------------- /Solidity.md: -------------------------------------------------------------------------------- 1 | ## Solidity 2 | 3 | ### 1. 开发环境搭建 4 | 1. **安装必要工具**: 5 | - Node.js 6 | - npm (Node.js 包管理器) 7 | - Git 8 | 2. **安装开发框架**: 9 | ```bash 10 | # 安装 Truffle 框架 11 | npm install -g truffle 12 | 13 | # 安装 Ganache (本地测试网络) 14 | npm install -g ganache 15 | ``` 16 | 17 | 3. **IDE 选择**: 18 | - Remix IDE (在线 IDE) 19 | - VS Code + Solidity 插件 20 | - IntelliJ IDEA + Solidity 插件 21 | ### 2. 项目初始化 22 | 23 | ```bash 24 | # 创建新项目 25 | mkdir my-contract 26 | cd my-contract 27 | truffle init 28 | ``` 29 | 30 | 项目结构: 31 | ``` 32 | my-contract/ 33 | ├── contracts/ # 智能合约文件 34 | ├── migrations/ # 部署脚本 35 | ├── test/ # 测试文件 36 | └── truffle-config.js # 配置文件 37 | ``` 38 | ### 3. 编写智能合约 39 | 40 | ```solidity:contracts/MyContract.sol 41 | // SPDX-License-Identifier: MIT 42 | pragma solidity ^0.8.0; 43 | 44 | contract MyContract { 45 | uint256 public value; 46 | 47 | constructor() { 48 | value = 0; 49 | } 50 | 51 | function setValue(uint256 _value) public { 52 | value = _value; 53 | } 54 | 55 | function getValue() public view returns (uint256) { 56 | return value; 57 | } 58 | } 59 | ``` 60 | 61 | ### 4. 编写部署脚本 62 | 63 | ```javascript:migrations/2_deploy_contracts.js 64 | const MyContract = artifacts.require("MyContract"); 65 | 66 | module.exports = function(deployer) { 67 | deployer.deploy(MyContract); 68 | }; 69 | ``` 70 | 71 | ### 5. 配置网络 72 | 73 | ```javascript:truffle-config.js 74 | module.exports = { 75 | networks: { 76 | development: { 77 | host: "127.0.0.1", 78 | port: 7545, 79 | network_id: "*" 80 | }, 81 | testnet: { 82 | provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/${infuraKey}`), 83 | network_id: 3, 84 | gas: 5500000 85 | }, 86 | mainnet: { 87 | provider: () => new HDWalletProvider(mnemonic, `https://mainnet.infura.io/v3/${infuraKey}`), 88 | network_id: 1, 89 | gas: 5500000 90 | } 91 | } 92 | }; 93 | ``` 94 | 95 | ### 6. 本地测试 96 | 1. **启动 Ganache**: 97 | ```bash 98 | ganache 99 | ``` 100 | 101 | 2. **编译合约**: 102 | ```bash 103 | truffle compile 104 | ``` 105 | 106 | 3. **部署到本地网络**: 107 | ```bash 108 | truffle migrate --network development 109 | ``` 110 | 111 | 4. **运行测试**: 112 | ```bash 113 | truffle test 114 | ``` 115 | 116 | ### 7. 部署到测试网/主网 117 | 1. **准备钱包**: 118 | - 创建钱包 119 | - 获取助记词 120 | - 确保有足够的测试币/ETH 121 | 2. **配置环境变量**: 122 | ```bash 123 | # .env 文件 124 | MNEMONIC="your wallet mnemonic" 125 | INFURA_KEY="your infura key" 126 | ``` 127 | 128 | 3. **部署到测试网**: 129 | ```bash 130 | truffle migrate --network testnet 131 | ``` 132 | 133 | 4. **部署到主网**: 134 | ```bash 135 | truffle migrate --network mainnet 136 | ``` 137 | 138 | ### 8. 验证合约 139 | 1. **在区块浏览器上验证**: 140 | - Etherscan (以太坊) 141 | - BscScan (BSC) 142 | - 其他链的区块浏览器 143 | 2. **验证合约代码**: 144 | - 上传源代码 145 | - 验证编译器版本 146 | - 验证优化设置 147 | ### 9. 安全注意事项 148 | 1. **代码审计**: 149 | - 使用自动化工具检查 150 | - 进行人工代码审查 151 | - 考虑第三方审计 152 | 2. **常见安全实践**: 153 | - 使用 SafeMath 库 154 | - 实现访问控制 155 | - 避免重入攻击 156 | - 正确处理异常 157 | ### 10. 维护和升级 158 | 1. **监控合约**: 159 | - 使用区块浏览器 160 | - 设置事件监听 161 | - 监控异常交易 162 | 2. **升级策略**: 163 | - 使用代理模式 164 | - 实现升级机制 165 | - 保留回滚选项 166 | ### 11. 常用工具和资源 167 | 1. **开发工具**: 168 | - Hardhat 169 | - OpenZeppelin 170 | - Web3.js/ethers.js 171 | 2. **测试工具**: 172 | - Mocha 173 | - Chai 174 | - Waffle 175 | 3. **安全工具**: 176 | - Slither 177 | - Mythril 178 | - Oyente 179 | 4. **区块浏览器**: 180 | - Etherscan 181 | - BscScan 182 | - Polygonscan 183 | ### 12. 最佳实践 184 | 1. **代码规范**: 185 | - 遵循 Solidity 风格指南 186 | - 使用有意义的变量名 187 | - 添加适当的注释 188 | 2. **测试覆盖**: 189 | - 编写单元测试 190 | - 进行集成测试 191 | - 模拟各种场景 192 | 3. **文档编写**: 193 | - 编写技术文档 194 | - 提供用户指南 195 | - 记录已知问题 196 | -------------------------------------------------------------------------------- /Vyper.md: -------------------------------------------------------------------------------- 1 | ## Vyper 2 | 3 | ### 1.Vyper 是一种面向合约的 Python 编程语言,专为以太坊虚拟机(EVM)设计。它的主要特点是: 4 | - 语法简单,类似 Python 5 | - 强类型系统 6 | - 安全性优先 7 | - 可读性强 8 | - 不支持继承和递归 9 | ### 2. 开发环境搭建 10 | 1. 安装 Python (推荐 3.7+) 11 | 2. 安装 Vyper: 12 | ```bash 13 | pip install vyper 14 | ``` 15 | 16 | 3. 安装开发工具: 17 | ```bash 18 | pip install eth-brownie # 开发框架 19 | pip install web3 # 以太坊交互 20 | ``` 21 | 22 | ### 3. 编写智能合约 23 | 创建一个简单的代币合约示例 `Token.vy`: 24 | ``` 25 | # @version 0.3.7 26 | 27 | # 事件定义 28 | event Transfer: 29 | sender: indexed(address) 30 | receiver: indexed(address) 31 | value: uint256 32 | 33 | # 状态变量 34 | name: public(String[32]) 35 | symbol: public(String[32]) 36 | decimals: public(uint8) 37 | totalSupply: public(uint256) 38 | balanceOf: public(HashMap[address, uint256]) 39 | 40 | @external 41 | def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _totalSupply: uint256): 42 | self.name = _name 43 | self.symbol = _symbol 44 | self.decimals = _decimals 45 | self.totalSupply = _totalSupply 46 | self.balanceOf[msg.sender] = _totalSupply 47 | 48 | @external 49 | def transfer(_to: address, _value: uint256) -> bool: 50 | assert self.balanceOf[msg.sender] >= _value 51 | self.balanceOf[msg.sender] -= _value 52 | self.balanceOf[_to] += _value 53 | log Transfer(msg.sender, _to, _value) 54 | return True 55 | ``` 56 | 57 | ### 4. 编译合约 58 | 使用 Vyper 编译器编译合约: 59 | ``` 60 | vyper contracts/Token.vy 61 | ``` 62 | 或者使用 Brownie 编译: 63 | ``` 64 | brownie compile 65 | ``` 66 | 67 | ### 5. 测试合约 68 | 创建测试文件 `tests/test_token.py`: 69 | ``` 70 | from brownie import Token, accounts 71 | 72 | def test_token(): 73 | # 部署合约 74 | token = Token.deploy("Test Token", "TT", 18, 1000000, {'from': accounts[0]}) 75 | 76 | # 测试初始状态 77 | assert token.name() == "Test Token" 78 | assert token.totalSupply() == 1000000 79 | 80 | # 测试转账 81 | token.transfer(accounts[1], 100, {'from': accounts[0]}) 82 | assert token.balanceOf(accounts[1]) == 100 83 | ``` 84 | 运行测试: 85 | ``` 86 | brownie test 87 | ``` 88 | 89 | ### 6. 部署合约 90 | 1. 配置网络 (以 Goerli 测试网为例): 91 | ```python:brownie-config.yaml 92 | networks: 93 | default: goerli 94 | goerli: 95 | host: https://goerli.infura.io/v3/YOUR-PROJECT-ID 96 | chainid: 5 97 | ``` 98 | 99 | 2. 部署脚本 `scripts/deploy.py`: 100 | ```python:scripts/deploy.py 101 | from brownie import Token, accounts, network 102 | 103 | def main(): 104 | # 连接到网络 105 | network.connect('goerli') 106 | 107 | # 获取账户 108 | account = accounts.load('my_wallet') 109 | 110 | # 部署合约 111 | token = Token.deploy( 112 | "Test Token", 113 | "TT", 114 | 18, 115 | 1000000, 116 | {'from': account} 117 | ) 118 | 119 | print(f"Token deployed at: {token.address}") 120 | ``` 121 | 122 | 3. 部署命令: 123 | ``` 124 | brownie run scripts/deploy.py 125 | ``` 126 | ### 7. 与合约交互 127 | 使用 Web3.py 与已部署的合约交互: 128 | ``` 129 | from web3 import Web3 130 | from vyper import compile_code 131 | 132 | # 连接以太坊节点 133 | w3 = Web3(Web3.HTTPProvider('https://goerli.infura.io/v3/YOUR-PROJECT-ID')) 134 | 135 | # 合约地址和 ABI 136 | contract_address = "0x..." 137 | contract_abi = [...] # 从编译后的合约获取 138 | 139 | # 创建合约实例 140 | contract = w3.eth.contract(address=contract_address, abi=contract_abi) 141 | 142 | # 调用合约方法 143 | balance = contract.functions.balanceOf(w3.eth.accounts[0]).call() 144 | print(f"Balance: {balance}") 145 | ``` 146 | ### 8. 安全注意事项 147 | 1. 整数溢出检查 148 | 2. 重入攻击防护 149 | 3. 权限控制 150 | 4. 事件记录 151 | 5. 代码审计 152 | ### 9. 最佳实践 153 | 1. 使用最新版本的 Vyper 154 | 2. 编写完整的测试用例 155 | 3. 进行代码审计 156 | 4. 使用标准库函数 157 | 5. 保持代码简洁 158 | 6. 添加适当的注释 159 | 7. 实现错误处理机制 160 | ### 10. 常用工具和资源 161 | 1. Vyper 官方文档: https://vyper.readthedocs.io/ 162 | 2. Brownie 文档: https://eth-brownie.readthedocs.io/ 163 | 3. Remix IDE: https://remix.ethereum.org/ 164 | 4. Etherscan: https://etherscan.io/ 165 | 5. OpenZeppelin Contracts: https://openzeppelin.com/contracts/ 166 | -------------------------------------------------------------------------------- /Rust.md: -------------------------------------------------------------------------------- 1 | ## Rust 2 | 3 | ### 1. 开发环境搭建 4 | 1. **安装 Rust** 5 | ```bash 6 | # 使用 rustup 安装 Rust 7 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 8 | 9 | # 验证安装 10 | rustc --version 11 | cargo --version 12 | ``` 13 | 14 | 2. **IDE 配置** 15 | - 推荐使用 VS Code + Rust Analyzer 插件 16 | - 其他可选:IntelliJ IDEA + Rust 插件 17 | ### 2. 项目开发 18 | 1. **创建新项目** 19 | ```bash 20 | # 创建二进制项目 21 | cargo new my_project 22 | 23 | # 创建库项目 24 | cargo new --lib my_lib 25 | ``` 26 | 27 | 2. **项目结构** 28 | ``` 29 | my_project/ 30 | ├── Cargo.toml # 项目配置和依赖 31 | ├── src/ 32 | │ ├── main.rs # 主程序入口 33 | │ └── lib.rs # 库文件(如果存在) 34 | └── target/ # 编译输出目录 35 | ``` 36 | 37 | 3. **依赖管理** 38 | ```toml 39 | # Cargo.toml 示例 40 | [package] 41 | name = "my_project" 42 | version = "0.1.0" 43 | edition = "2021" 44 | 45 | [dependencies] 46 | tokio = { version = "1.0", features = ["full"] } 47 | serde = { version = "1.0", features = ["derive"] } 48 | ``` 49 | 50 | ### 3. 开发实践 51 | 1. **代码组织** 52 | - 使用模块系统组织代码 53 | - 遵循 Rust 的命名规范 54 | - 使用 `cargo fmt` 和 `cargo clippy` 保持代码质量 55 | 2. **测试** 56 | ```rust 57 | // 单元测试 58 | #[cfg(test)] 59 | mod tests { 60 | #[test] 61 | fn test_example() { 62 | assert_eq!(2 + 2, 4); 63 | } 64 | } 65 | 66 | // 运行测试 67 | cargo test 68 | ``` 69 | 70 | 3. **文档** 71 | ``` 72 | /// 函数文档示例 73 | /// 74 | /// # Examples 75 | /// 76 | /// ``` 77 | /// let result = add(2, 2); 78 | /// assert_eq!(result, 4); 79 | /// ``` 80 | pub fn add(a: i32, b: i32) -> i32 { 81 | a + b 82 | } 83 | ``` 84 | ### 4. 构建和优化 85 | 1. **发布构建** 86 | ```bash 87 | # 优化构建 88 | cargo build --release 89 | 90 | # 检查优化后的二进制大小 91 | cargo bloat --release 92 | ``` 93 | 94 | 2. **性能优化** 95 | - 使用 `#[inline]` 优化关键函数 96 | - 使用 `unsafe` 块进行性能关键代码优化 97 | - 使用 `cargo flamegraph` 进行性能分析 98 | ### 5. 部署 99 | 1. **Docker 部署** 100 | ```dockerfile 101 | # 多阶段构建 102 | FROM rust:1.70 as builder 103 | WORKDIR /usr/src/app 104 | COPY . . 105 | RUN cargo build --release 106 | 107 | FROM debian:buster-slim 108 | COPY --from=builder /usr/src/app/target/release/my_app /usr/local/bin/my_app 109 | CMD ["my_app"] 110 | ``` 111 | 112 | 2. **系统服务部署** 113 | ```systemd 114 | # /etc/systemd/system/my_app.service 115 | [Unit] 116 | Description=My Rust Application 117 | After=network.target 118 | 119 | [Service] 120 | Type=simple 121 | User=appuser 122 | WorkingDirectory=/opt/my_app 123 | ExecStart=/usr/local/bin/my_app 124 | Restart=always 125 | 126 | [Install] 127 | WantedBy=multi-user.target 128 | ``` 129 | 130 | ### 6. 监控和日志 131 | 1. **日志配置** 132 | ```rust 133 | use log::{info, error}; 134 | use env_logger; 135 | 136 | fn main() { 137 | env_logger::init(); 138 | info!("Application started"); 139 | // ... 140 | } 141 | ``` 142 | 143 | 2. **指标收集** 144 | ```rust 145 | use metrics::{counter, gauge}; 146 | use metrics_exporter_prometheus::PrometheusBuilder; 147 | 148 | fn setup_metrics() { 149 | PrometheusBuilder::new() 150 | .install() 151 | .expect("Failed to install metrics recorder"); 152 | } 153 | ``` 154 | 155 | ### 7. 持续集成/持续部署 (CI/CD) 156 | 1. **GitHub Actions 示例** 157 | ```yaml 158 | name: Rust CI 159 | 160 | on: 161 | push: 162 | branches: [ main ] 163 | pull_request: 164 | branches: [ main ] 165 | 166 | jobs: 167 | build: 168 | runs-on: ubuntu-latest 169 | steps: 170 | - uses: actions/checkout@v2 171 | - name: Build 172 | run: cargo build --release 173 | - name: Test 174 | run: cargo test 175 | - name: Deploy 176 | run: | 177 | scp target/release/my_app user@server:/opt/my_app 178 | ssh user@server "systemctl restart my_app" 179 | ``` 180 | 181 | ### 8. 安全考虑 182 | 1. **依赖安全** 183 | ```bash 184 | # 检查依赖漏洞 185 | cargo audit 186 | ``` 187 | 188 | 2. **代码安全** 189 | - 使用 `#![forbid(unsafe_code)]` 限制不安全代码 190 | - 使用 `cargo-geiger` 检查不安全代码使用情况 191 | ### 9. 性能监控 192 | 1. **使用 Prometheus + Grafana** 193 | ```rust 194 | use prometheus::{Counter, Registry}; 195 | 196 | let counter = Counter::new("requests_total", "Total number of requests").unwrap(); 197 | let registry = Registry::new(); 198 | registry.register(Box::new(counter.clone())).unwrap(); 199 | ``` 200 | 201 | ### 10. 错误处理 202 | 203 | ```rust 204 | use thiserror::Error; 205 | 206 | #[derive(Error, Debug)] 207 | pub enum AppError { 208 | #[error("IO error: {0}")] 209 | Io(#[from] std::io::Error), 210 | #[error("Database error: {0}")] 211 | Database(String), 212 | } 213 | 214 | fn main() -> Result<(), AppError> { 215 | // 错误处理代码 216 | Ok(()) 217 | } 218 | ``` 219 | 220 | ``` 221 | --------------------------------------------------------------------------------