# Charter语言语法指南
**版本**: 0.1.0
**NAC UDM**: 1.0.0
**NVM Target**: 2.0
**日期**: 2026-02-20
---
## 一、Charter语言简介
Charter是NAC区块链的原生智能合约语言,专为RWA(Real World Assets)资产上链设计。
### 1.1 设计原则
- ❌ **不是Solidity**:Charter是独立设计的语言
- ✅ **RWA专用**:内置资产合规、估值、托管功能
- ✅ **宪法约束**:所有合约受CNNL宪法约束
- ✅ **类型安全**:强类型系统,编译时检查
### 1.2 与Solidity的区别
| 特性 | Solidity | Charter |
|------|----------|---------|
| 地址类型 | 20字节 | 32字节 |
| 哈希算法 | Keccak-256 | SHA3-384 (48字节) |
| 虚拟机 | EVM | NVM |
| 字符串类型 | string | String (大写) |
| 可见性 | public/private | public/private/constitutional |
---
## 二、基本语法
### 2.1 合约声明
```charter
// Charter合约使用contract关键字
contract AssetToken {
// 合约内容
}
```
### 2.2 状态变量
```charter
contract Example {
// 基本类型(注意大写)
String name; // 字符串类型
U256 totalSupply; // 无符号256位整数
Address owner; // NAC地址(32字节)
Bool isActive; // 布尔类型
// 映射类型
Mapping
balances;
// 数组类型
Array holders;
}
```
### 2.3 函数定义
```charter
contract Example {
// 构造函数
constructor(String _name, U256 _supply) {
name = _name;
totalSupply = _supply;
owner = msg.sender;
}
// 公开函数
function transfer(Address to, U256 amount) public returns (Bool) {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[to] += amount;
return true;
}
// 只读函数
function getBalance(Address account) public view returns (U256) {
return balances[account];
}
// 宪法约束函数
function mint(Address to, U256 amount) public constitutional {
// 此函数受CNNL宪法规则约束
totalSupply += amount;
balances[to] += amount;
}
}
```
---
## 三、数据类型
### 3.1 基本类型
```charter
// 整数类型
U8, U16, U32, U64, U128, U256 // 无符号整数
I8, I16, I32, I64, I128, I256 // 有符号整数
// 字符串和字节
String // UTF-8字符串
Bytes // 字节数组
Bytes32, Bytes48 // 固定长度字节
// 布尔和地址
Bool // true/false
Address // NAC地址(32字节)
Hash // NAC哈希(48字节,SHA3-384)
```
### 3.2 复合类型
```charter
// 映射
Mapping balances;
Mapping> allowances;
// 数组
Array holders;
Array amounts;
// 结构体
struct Asset {
String name;
U256 value;
Address owner;
Bool verified;
}
```
---
## 四、完整示例
### 4.1 简单代币合约
```charter
// NAC Charter代币合约示例
contract SimpleToken {
// 状态变量
String public name;
String public symbol;
U256 public totalSupply;
Address public owner;
Mapping balances;
Mapping> allowances;
// 事件
event Transfer(Address indexed from, Address indexed to, U256 value);
event Approval(Address indexed owner, Address indexed spender, U256 value);
// 构造函数
constructor(String _name, String _symbol, U256 _initialSupply) {
name = _name;
symbol = _symbol;
totalSupply = _initialSupply;
owner = msg.sender;
balances[msg.sender] = _initialSupply;
}
// 查询余额
function balanceOf(Address account) public view returns (U256) {
return balances[account];
}
// 转账
function transfer(Address to, U256 amount) public returns (Bool) {
require(balances[msg.sender] >= amount, "Insufficient balance");
require(to != Address.zero(), "Invalid recipient");
balances[msg.sender] -= amount;
balances[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
// 授权
function approve(Address spender, U256 amount) public returns (Bool) {
allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
// 查询授权额度
function allowance(Address _owner, Address spender) public view returns (U256) {
return allowances[_owner][spender];
}
// 授权转账
function transferFrom(Address from, Address to, U256 amount) public returns (Bool) {
require(balances[from] >= amount, "Insufficient balance");
require(allowances[from][msg.sender] >= amount, "Insufficient allowance");
require(to != Address.zero(), "Invalid recipient");
balances[from] -= amount;
balances[to] += amount;
allowances[from][msg.sender] -= amount;
emit Transfer(from, to, amount);
return true;
}
}
```
### 4.2 RWA资产合约
```charter
// NAC RWA资产合约
contract RealWorldAsset {
// 资产信息
String public assetName;
String public assetType; // 房产、艺术品、股权等
U256 public assetValue; // 资产估值(XTZH)
Address public custodian; // 托管方
Bool public verified; // 合规验证状态
// 所有权信息
Address public owner;
U256 public totalShares; // 总份额
Mapping shareBalances;
// DNA信息
Bytes48 public assetDNA; // 资产DNA(唯一标识)
// 事件
event AssetVerified(Bytes48 dna, U256 value);
event ShareTransfer(Address indexed from, Address indexed to, U256 shares);
// 构造函数
constructor(
String _name,
String _type,
U256 _value,
Address _custodian,
U256 _totalShares
) {
assetName = _name;
assetType = _type;
assetValue = _value;
custodian = _custodian;
owner = msg.sender;
totalShares = _totalShares;
shareBalances[msg.sender] = _totalShares;
verified = false;
}
// 合规验证(仅托管方可调用)
function verify(Bytes48 _dna) public constitutional {
require(msg.sender == custodian, "Only custodian can verify");
require(!verified, "Already verified");
assetDNA = _dna;
verified = true;
emit AssetVerified(_dna, assetValue);
}
// 转让份额
function transferShares(Address to, U256 shares) public returns (Bool) {
require(verified, "Asset not verified");
require(shareBalances[msg.sender] >= shares, "Insufficient shares");
require(to != Address.zero(), "Invalid recipient");
shareBalances[msg.sender] -= shares;
shareBalances[to] += shares;
emit ShareTransfer(msg.sender, to, shares);
return true;
}
// 查询份额
function sharesOf(Address account) public view returns (U256) {
return shareBalances[account];
}
// 更新估值(仅托管方可调用)
function updateValuation(U256 newValue) public constitutional {
require(msg.sender == custodian, "Only custodian can update");
assetValue = newValue;
}
}
```
---
## 五、编译和部署
### 5.1 编译合约
```bash
# 检查语法
charter check --input contract.charter
# 编译到NVM字节码
charter compile --input contract.charter --output contract.nvm
# 显示AST
charter ast --input contract.charter
# 查看版本
charter version
```
### 5.2 部署合约
```bash
# 使用NAC CLI部署
nac contract deploy --bytecode contract.nvm --args "TokenName,TKN,1000000"
```
---
## 六、内置函数和变量
### 6.1 全局变量
```charter
msg.sender // 调用者地址
msg.value // 发送的XTZH数量
block.number // 当前区块号
block.timestamp // 当前区块时间戳
tx.origin // 交易发起者
```
### 6.2 内置函数
```charter
require(condition, message) // 断言,失败时回滚
assert(condition) // 断言,失败时panic
revert(message) // 回滚交易
keccak256(data) // 计算哈希(NAC使用SHA3-384)
```
---
## 七、最佳实践
### 7.1 安全建议
1. 总是检查地址有效性
2. 使用`require`进行输入验证
3. 防止重入攻击
4. 避免整数溢出
5. 遵循CNNL宪法规则
### 7.2 代码风格
1. 合约名使用大驼峰(PascalCase)
2. 函数名使用小驼峰(camelCase)
3. 常量使用全大写+下划线
4. 添加详细注释
---
## 八、与CNNL集成
Charter合约可以被CNNL宪法约束:
```charter
contract CompliantToken {
// constitutional修饰符表示此函数受宪法约束
function mint(Address to, U256 amount) public constitutional {
// CNNL会在执行前检查合规性
totalSupply += amount;
balances[to] += amount;
}
}
```
---
## 九、常见错误
### 错误1:类型不匹配
```
❌ string name; // Solidity风格
✅ String name; // Charter风格
```
### 错误2:地址长度
```
❌ address(20字节) // 以太坊
✅ Address(32字节) // NAC
```
### 错误3:哈希算法
```
❌ keccak256 → 32字节
✅ sha3_384 → 48字节
```
---
## 十、参考资源
- NAC UDM文档: https://docs.newassetchain.io/udm
- NVM规范: https://docs.newassetchain.io/nvm
- CNNL宪法语言: https://docs.newassetchain.io/cnnl
- Charter示例库: https://github.com/newassetchain/charter-examples
---
**文档维护**: NAC技术团队
**最后更新**: 2026-02-20
**反馈**: tech@newassetchain.io