NAC_Blockchain/nac-ai-valuation/valuation-ui/server.js

1152 lines
56 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
/**
* NAC AI 资产估值问答界面 - 服务端 v2.0
* 新增:
* - 20大类资产 × 60+辖区 知识库集成
* - 辖区感知估值(每个辖区独立参数模型)
* - 三重价值输出(当地货币 + USD + XTZH
* - 智能资产类型和辖区识别
* - /api/v4/asset-categories 资产分类接口
* - /api/v4/jurisdictions 辖区列表接口
*/
const express = require('express');
const http = require('http');
const path = require('path');
// 知识库适配层
const { ASSET_VALUATION_KB, ASSET_KEYWORDS: ASSET_KB_KEYWORDS } = require('./knowledge/asset_valuation_kb');
const { JURISDICTION_KB } = require('./knowledge/jurisdiction_kb');
// 适配:将 ASSET_VALUATION_KB 映射为 ASSET_CATEGORIESserver.js 内部使用格式)
const ASSET_CATEGORIES = {};
Object.entries(ASSET_VALUATION_KB).forEach(([key, cat]) => {
const lowerKey = key.toLowerCase();
ASSET_CATEGORIES[lowerKey] = {
code: cat.gnacs || lowerKey,
name: cat.name,
nameEn: cat.nameEn || '',
icon: cat.icon || '📦',
subcategories: {}
};
if (cat.subcategories) {
Object.entries(cat.subcategories).forEach(([sk, sub]) => {
ASSET_CATEGORIES[lowerKey].subcategories[sk.toLowerCase()] = {
name: sub.name || sk,
types: sub.types || [],
methods: sub.valuationMethods ? [sub.valuationMethods.primary, ...(sub.valuationMethods.secondary || [])] : [],
keyParams: sub.keyParameters || sub.keyParams || []
};
});
}
});
// 辖区国旗映射
const JURISDICTION_FLAGS = {
HK:'🇭🇰', SG:'🇸🇬', US:'🇺🇸', GB:'🇬🇧', DE:'🇩🇪', FR:'🇫🇷', JP:'🇯🇵', KR:'🇰🇷',
AU:'🇦🇺', AE:'🇦🇪', CN:'🇨🇳', TW:'🇹🇼', MY:'🇲🇾', IN:'🇮🇳', CH:'🇨🇭', CA:'🇨🇦',
SA:'🇸🇦', BR:'🇧🇷', ZA:'🇿🇦', IL:'🇮🇱', NL:'🇳🇱', EU:'🇪🇺', NZ:'🇳🇿', QA:'🇶🇦',
KW:'🇰🇼', BH:'🇧🇭', RU:'🇷🇺', AR:'🇦🇷', CL:'🇨🇱', NG:'🇳🇬', EG:'🇪🇬', KE:'🇰🇪',
MX:'🇲🇽', IT:'🇮🇹', ES:'🇪🇸', TR:'🇹🇷', MO:'🇲🇴', TH:'🇹🇭', ID:'🇮🇩', PH:'🇵🇭',
VN:'🇻🇳', PT:'🇵🇹', SE:'🇸🇪', NO:'🇳🇴', DK:'🇩🇰', FI:'🇫🇮', PL:'🇵🇱', CZ:'🇨🇿',
HU:'🇭🇺', RO:'🇷🇴', GR:'🇬🇷', AT:'🇦🇹', BE:'🇧🇪', LU:'🇱🇺', IE:'🇮🇪', SZ:'🇸🇿'
};
// 适配:将 JURISDICTION_KB 映射为 JURISDICTION_MODELS
const JURISDICTION_MODELS = {};
Object.entries(JURISDICTION_KB).forEach(([code, j]) => {
JURISDICTION_MODELS[code] = {
...j,
flag: JURISDICTION_FLAGS[code] || '🌍',
regulator: Array.isArray(j.regulators) ? j.regulators.join('/') : (j.regulator || 'N/A'),
realEstate: j.realEstate ? {
residential: {
primaryMethod: j.realEstate.valuationMethods ? j.realEstate.valuationMethods[0] : '市场比较法',
capRate: j.realEstate.residentialCapRate ? {
range: `${j.realEstate.residentialCapRate.min}-${j.realEstate.residentialCapRate.max}%`,
note: `均值 ${j.realEstate.residentialCapRate.avg}%`
} : null,
foreignOwnership: j.realEstate.foreignOwnership || '无特殊限制',
taxConsiderations: j.realEstate.stampDuty ? JSON.stringify(j.realEstate.stampDuty).replace(/[{}"]|\\n/g, ' ') : null,
specialRules: j.realEstate.keyFactors || []
},
commercial: {
capRate: j.realEstate.commercialCapRate ? {
range: `${j.realEstate.commercialCapRate.min}-${j.realEstate.commercialCapRate.max}%`,
note: `均值 ${j.realEstate.commercialCapRate.avg}%`
} : null
}
} : null
};
});
// GNACS 编码映射
const GNACS_CODES = {
'GNACS-01': { key: 'real_estate', name: '不动产类' },
'GNACS-02': { key: 'financial_securities', name: '金融证券类' },
'GNACS-03': { key: 'commodities', name: '大宗商品类' },
'GNACS-04': { key: 'art_collectibles', name: '艺术品与收藏品类' },
'GNACS-05': { key: 'intellectual_property', name: '知识产权类' },
'GNACS-06': { key: 'digital_assets', name: '数字资产类' },
'GNACS-07': { key: 'infrastructure', name: '基础设施类' },
'GNACS-08': { key: 'natural_resources', name: '自然资源类' },
'GNACS-09': { key: 'environmental_rights', name: '环境权益类' },
'GNACS-10': { key: 'corporate_equity', name: '企业权益类' },
'GNACS-11': { key: 'debt_assets', name: '债权类' },
'GNACS-12': { key: 'insurance_products', name: '保险产品类' },
'GNACS-13': { key: 'agricultural_assets', name: '农业资产类' },
'GNACS-14': { key: 'vehicles', name: '交通工具类' },
'GNACS-15': { key: 'machinery_equipment', name: '机械设备类' },
'GNACS-16': { key: 'data_assets', name: '数据资产类' },
'GNACS-17': { key: 'brand_assets', name: '品牌资产类' },
'GNACS-18': { key: 'sports_assets', name: '体育资产类' },
'GNACS-19': { key: 'entertainment_assets', name: '娱乐资产类' },
'GNACS-20': { key: 'other_assets', name: '其他资产类' }
};
// 关键词映射 - 重建为嵌套格式供 detectAssetType 使用
const ASSET_KEYWORDS = {
real_estate: {
residential: ['住宅','公寓','别墅','房子','房产','套房','单元房','联排','独栋','学区房','老年公寓','度假屋'],
commercial: ['写字楼','商铺','商业地产','零售','购物中心','酒店','商业综合体','办公楼','甲级','乙级'],
industrial: ['厂房','仓储','工业','物流','冷链','数据中心','工业园','仓库'],
agricultural: ['农地','耕地','农田','果园','林地','渔场','牧场','温室','农业用地'],
infrastructure: ['基础设施','港口','机场','高速','管道','电网','水务','轨道交通']
},
intellectual_property: {
copyright: ['版权','著作权','音乐版权','影视版权','文学版权','软件著作权','版税','授权收入'],
patent: ['专利','发明专利','实用新型','外观设计','许可费','技术转让','专利授权'],
trademark: ['商标','品牌授权','商标权','注册商标','品牌价值'],
portrait_rights: ['肖像权','形象权','姓名权','艺人','网红','运动员','明星IP','人物IP'],
trade_secret: ['商业秘密','技术秘密','配方','工艺'],
domain: ['域名','网络资产','互联网资产']
},
art_collectibles: {
fine_art: ['艺术品','油画','水墨','雕塑','版画','当代艺术','毕加索','梵高','齐白石','张大千'],
antiques: ['古董','文物','古玩','瓷器','青铜器','字画','古籍'],
luxury: ['名表','劳力士','百达翡丽','爱彼','珠宝','钻石','宝石','翡翠'],
wine: ['红酒','葡萄酒','威士忌','白兰地','茅台','收藏酒'],
collectibles: ['邮票','钱币','球星卡','限量版','收藏品']
},
financial_securities: {
stocks: ['股票','股权','上市公司','A股','港股','美股','纳斯达克','纽交所'],
bonds: ['债券','国债','企业债','可转债','债权'],
funds: ['基金','私募','公募','REITs','房地产信托','对冲基金'],
derivatives: ['期权','期货','衍生品','结构化产品']
},
corporate_equity: {
unlisted: ['非上市','未上市股权','私人公司','创业公司','初创','股份','股东','PE','VC','天使'],
listed: ['上市公司','控股','大股东','战略股东'],
startup: ['初创企业','独角兽','估值','融资轮次','A轮','B轮','C轮']
},
commodities: {
precious_metals: ['黄金','白银','铂金','钯金','贵金属','金条','金币'],
energy: ['石油','天然气','煤炭','能源','原油','LNG'],
agricultural_commodities: ['大豆','小麦','玉米','棉花','糖','咖啡','农产品期货'],
metals: ['铜','铝','铁矿石','锂','稀土','工业金属']
},
digital_assets: {
cryptocurrency: ['比特币','以太坊','加密货币','虚拟货币','数字货币','BTC','ETH'],
nft: ['NFT','非同质化代币','数字艺术','数字收藏品'],
metaverse: ['元宇宙','虚拟土地','虚拟资产','游戏资产','Sandbox','Decentraland']
},
environmental_rights: {
carbon: ['碳排放权','碳信用','碳汇','VCS','Gold Standard','CDM','碳中和','CCER'],
renewable: ['可再生能源','绿证','REC','绿色电力','光伏','风电'],
water: ['水权','排污权','环境权益']
},
data_assets: {
data: ['数据资产','数据集','用户数据','大数据','AI数据','训练数据','数据库'],
algorithm: ['算法','AI模型','机器学习模型','深度学习']
},
brand_assets: {
brand: ['品牌','品牌价值','商誉','特许经营','加盟权','品牌授权','连锁品牌'],
franchise: ['特许经营权','加盟','特许牌照','经营许可']
},
sports_assets: {
club: ['体育俱乐部','足球俱乐部','篮球队','球队','球员转会'],
rights: ['赛事版权','转播权','体育IP','运动员合同']
},
entertainment_assets: {
film_tv: ['影视版权','电影版权','电视剧版权','流媒体权益','院线'],
music_rights: ['音乐版权','唱片','流媒体版权','演唱会版权'],
gaming: ['游戏IP','游戏版权','游戏资产']
},
natural_resources: {
mining: ['矿权','采矿权','矿产','矿山','金矿','铜矿','煤矿'],
forest: ['林权','森林碳汇','木材','林地资源'],
water_resources: ['水资源','水域使用权','渔业权']
},
infrastructure: {
transport: ['港口','机场','高速公路','铁路','轨道交通','桥梁隧道'],
utilities: ['电网','水务','燃气管道','通信基础设施'],
energy_infra: ['发电站','变电站','储能设施','充电桩']
},
debt_assets: {
receivables: ['应收账款','票据','债权','贷款','抵押贷款','消费贷'],
bonds_debt: ['债券','高收益债','不良资产','NPL']
},
insurance_products: {
life: ['人寿保险','寿险保单','年金','保险价值'],
property: ['财产保险','再保险','保险权益']
},
agricultural_assets: {
crops: ['农作物','粮食','蔬菜','水果','农业收益'],
livestock: ['牲畜','畜牧','家禽','水产','养殖'],
equipment: ['农业机械','农业设备','拖拉机','收割机']
},
vehicles: {
luxury_cars: ['豪车','超跑','法拉利','兰博基尼','保时捷','劳斯莱斯','宾利','迈巴赫'],
yacht: ['游艇','私人游艇','帆船','豪华游轮'],
aircraft: ['私人飞机','公务机','直升机','飞机'],
classic_cars: ['经典车','老爷车','复古车','收藏车']
},
machinery_equipment: {
industrial: ['工业设备','生产线','机床','数控机床','机械设备'],
medical: ['医疗设备','CT机','核磁共振','手术机器人'],
construction: ['工程机械','挖掘机','起重机','建筑设备']
}
};
const app = express();
const PORT = process.env.PORT || 3005;
app.use(express.json({ limit: '2mb' }));
app.use(express.static(path.join(__dirname, 'public')));
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization');
if (req.method === 'OPTIONS') return res.sendStatus(204);
next();
});
const VALUATION_ENGINE = { host: '127.0.0.1', port: 3003, timeout: 30000 };
const INFERENCE_ENGINE = { host: '127.0.0.1', port: 3001, timeout: 60000 };
let xtzhPriceCache = null;
let xtzhPriceCacheTime = 0;
const XTZH_CACHE_TTL = 5 * 60 * 1000;
// ============================================================
// 工具函数
// ============================================================
function proxyRequest(method, target, reqPath, body, timeout) {
return new Promise((resolve, reject) => {
const bodyStr = body ? JSON.stringify(body) : null;
const options = {
hostname: target.host, port: target.port, path: reqPath, method,
headers: { 'Content-Type': 'application/json', ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}) },
timeout: timeout || 10000
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => { try { resolve(JSON.parse(data)); } catch(e) { reject(new Error('Invalid JSON')); } });
});
req.on('error', reject);
req.on('timeout', () => { req.destroy(); reject(new Error('Timeout')); });
if (bodyStr) req.write(bodyStr);
req.end();
});
}
async function getXTZHPrice() {
if (xtzhPriceCache && Date.now() - xtzhPriceCacheTime < XTZH_CACHE_TTL) return xtzhPriceCache;
try {
const data = await proxyRequest('GET', VALUATION_ENGINE, '/api/v4/xtzh-price', null, 5000);
xtzhPriceCache = data;
xtzhPriceCacheTime = Date.now();
return data;
} catch(_) {
return { usd: 4.3944, source: 'fallback', goldCoverage: 1.25, sdrBasket: { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 } };
}
}
// ============================================================
// 智能识别:资产类型 + 辖区
// ============================================================
function detectAssetType(text) {
const lower = text.toLowerCase();
for (const [category, subcats] of Object.entries(ASSET_KEYWORDS)) {
for (const [subcat, keywords] of Object.entries(subcats)) {
for (const kw of keywords) {
if (lower.includes(kw.toLowerCase())) return { category, subcat };
}
}
}
return null;
}
function detectJurisdiction(text) {
const lower = text.toLowerCase();
const map = {
HK: ['香港','hong kong','hk','港岛','九龙','新界','差饷'],
SG: ['新加坡','singapore','sg','ccr','rcr','ocr','hdb','absd','ura'],
US: ['美国','united states','usa','纽约','洛杉矶','旧金山','加州','德州','new york','california','firpta'],
GB: ['英国','uk','united kingdom','伦敦','london','leasehold','sdlt','rics'],
DE: ['德国','germany','柏林','慕尼黑','法兰克福','berlin','munich','bafin'],
FR: ['法国','france','巴黎','paris','amf'],
JP: ['日本','japan','东京','大阪','tokyo','osaka','fsa'],
KR: ['韩国','korea','首尔','seoul','江南','전세'],
AU: ['澳大利亚','australia','悉尼','墨尔本','sydney','melbourne','firb','asic'],
AE: ['阿联酋','uae','迪拜','阿布扎比','dubai','abu dhabi','freehold','dld'],
CN: ['中国大陆','中国','china mainland','北京','上海','深圳','广州','成都','杭州','csrc'],
TW: ['台湾','taiwan','台北','taipei','fsc台湾'],
MY: ['马来西亚','malaysia','吉隆坡','kuala lumpur','sc马来'],
IN: ['印度','india','孟买','德里','mumbai','delhi','sebi'],
CH: ['瑞士','switzerland','苏黎世','日内瓦','zurich','geneva','finma'],
CA: ['加拿大','canada','多伦多','温哥华','toronto','vancouver','csa'],
SA: ['沙特','saudi','利雅得','riyadh','cma沙特'],
BR: ['巴西','brazil','圣保罗','sao paulo','cvm'],
ZA: ['南非','south africa','开普敦','约翰内斯堡','cape town','fsca'],
IL: ['以色列','israel','特拉维夫','tel aviv','isa以色列'],
NL: ['荷兰','netherlands','阿姆斯特丹','amsterdam','afm'],
EU: ['欧盟','european union','欧洲','esma','mifid'],
NZ: ['新西兰','new zealand','奥克兰','auckland','fma'],
QA: ['卡塔尔','qatar','多哈','doha','qfma'],
KW: ['科威特','kuwait','科威特城','cma科威特'],
BH: ['巴林','bahrain','麦纳麦','manama','cbb'],
RU: ['俄罗斯','russia','莫斯科','moscow','cbr'],
AR: ['阿根廷','argentina','布宜诺斯艾利斯','buenos aires'],
CL: ['智利','chile','圣地亚哥','santiago'],
NG: ['尼日利亚','nigeria','拉各斯','lagos'],
EG: ['埃及','egypt','开罗','cairo'],
KE: ['肯尼亚','kenya','内罗毕','nairobi'],
MX: ['墨西哥','mexico','墨西哥城'],
IT: ['意大利','italy','罗马','米兰','rome','milan'],
ES: ['西班牙','spain','马德里','巴塞罗那','madrid','barcelona'],
TR: ['土耳其','turkey','伊斯坦布尔','istanbul'],
MO: ['澳门','macau','macao'],
TH: ['泰国','thailand','曼谷','bangkok'],
ID: ['印度尼西亚','indonesia','雅加达','jakarta'],
PH: ['菲律宾','philippines','马尼拉','manila'],
VN: ['越南','vietnam','河内','胡志明','hanoi'],
};
for (const [code, keywords] of Object.entries(map)) {
for (const kw of keywords) {
if (lower.includes(kw)) return code;
}
}
return null;
}
function isValuationRequest(text) {
const vkw = ['估值','值多少','价格','价值','多少钱','市价','市值','评估','上链','通证化','valuation','worth','price','value','how much'];
const qkw = ['解释','什么是','如何','为什么','原理','机制','介绍','说明','区别','比较','explain','what is','how does','why','mechanism','difference'];
const lower = text.toLowerCase();
const hasV = vkw.some(k => lower.includes(k));
const hasQ = qkw.some(k => lower.includes(k));
if (hasQ && !hasV) return false;
return hasV;
}
// ============================================================
// 知识库回答生成
// ============================================================
async function generateKnowledgeAnswer(userMessage, assetType, jurisdiction) {
const lower = userMessage.toLowerCase();
const priceData = await getXTZHPrice();
const xtzhPrice = priceData.usd || 4.3944;
// XTZH 定价机制
if ((lower.includes('xtzh') || lower.includes('稳定币')) && (lower.includes('定价') || lower.includes('价格') || lower.includes('机制') || lower.includes('sdr') || lower.includes('稳定') || lower.includes('黄金'))) {
return buildXTZHPricingAnswer(xtzhPrice, priceData);
}
// GNACS 编码
if (lower.includes('gnacs') || (lower.includes('资产分类') && lower.includes('nac'))) {
return buildGNACSAnswer();
}
// 估值方法论
if (lower.includes('估值方法') || lower.includes('收益资本化') || lower.includes('市场比较法') || lower.includes('成本法') || lower.includes('dcf') || lower.includes('折现') || lower.includes('许可费节省')) {
return buildValuationMethodsAnswer(assetType);
}
// 上链流程
if (lower.includes('上链') || lower.includes('通证化') || lower.includes('tokenize') || lower.includes('acc-20') || lower.includes('charter')) {
return buildTokenizationAnswer(jurisdiction);
}
// NAC 公链介绍
if ((lower.includes('nac') || lower.includes('newassetchain')) && (lower.includes('介绍') || lower.includes('什么是') || lower.includes('公链') || lower.includes('rwa'))) {
return buildNACIntroAnswer();
}
// 辖区对比
if (lower.includes('对比') || lower.includes('比较辖区') || lower.includes('哪个辖区')) {
return buildJurisdictionCompareAnswer(xtzhPrice);
}
// 辖区感知资产估值
if (assetType) {
return buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage);
}
return null;
}
// ============================================================
// XTZH 定价机制
// ============================================================
function buildXTZHPricingAnswer(xtzhPrice, priceData) {
const basket = priceData.sdrBasket || { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 };
return `## XTZH 价值稳定机制详解
**XTZH新资产链稳定币** 是 NewAssetChain 公链的原生稳定币,采用 **SDR 锚定 + 黄金储备双重保障**机制。
### 一、SDR 五货币篮子
| 货币 | 权重 | 说明 |
|------|------|------|
| 美元 (USD) | ${(basket.USD * 100).toFixed(2)}% | 全球储备主导货币 |
| 欧元 (EUR) | ${(basket.EUR * 100).toFixed(2)}% | 欧元区货币 |
| 人民币 (CNY) | ${(basket.CNY * 100).toFixed(2)}% | 新兴市场代表 |
| 日元 (JPY) | ${(basket.JPY * 100).toFixed(2)}% | 亚太区货币 |
| 英镑 (GBP) | ${(basket.GBP * 100).toFixed(2)}% | 英联邦货币 |
### 二、黄金储备保障
- **储备覆盖率:** ${priceData.goldCoverage ? (priceData.goldCoverage * 100).toFixed(0) : 125}%(超额储备)
- **储备构成:** 实物黄金 + 黄金 ETF
- **质押规则:** 资产上链需质押 **80%** 等值 XTZH
- **再平衡触发:** 当 XTZH 偏离 SDR 基准 ±2% 时自动触发
### 三、当前价格
**XTZH/USD = $${xtzhPrice.toFixed(4)}**
### 四、双链双币架构
| 代币 | 类型 | 用途 |
|------|------|------|
| **XTZH** | 稳定币 | 资产估值、交易结算、质押担保 |
| **XIC** | 治理币 | 网络治理、节点激励、协议升级 |
> XTZH 不是投机性加密货币,而是 RWA 资产通证化的**价值锚点**,其稳定性由 SDR 篮子和实物黄金储备共同保障。`;
}
// ============================================================
// GNACS 说明
// ============================================================
function buildGNACSAnswer() {
let rows = '';
Object.entries(GNACS_CODES).forEach(([code, info]) => {
const cat = ASSET_CATEGORIES[info.key];
const icon = cat ? cat.icon : '';
const subcatCount = cat ? Object.keys(cat.subcategories).length : 0;
rows += `| ${code} | ${icon} ${info.name} | ${subcatCount} 个子类 |\n`;
});
return `## GNACS 全球新资产分类标准
**GNACSGlobal New Asset Classification Standard** 是 NAC 公链的原生资产分类体系,覆盖 **20 大类、60+ 子类**资产。
| 编码 | 资产类别 | 子类数量 |
|------|---------|---------|
${rows}
### 核心价值
每个 GNACS 编码对应:
- **独立估值模型** — 针对该类资产的专业估值方法
- **辖区合规规则** — 60+ 辖区的特定法规要求
- **ACC-20 协议参数** — 通证化标准参数
- **Charter 合约模板** — 预置智能合约模板
> 资产上链时,系统根据 GNACS 编码自动匹配估值模型和合规规则,无需手动配置。`;
}
// ============================================================
// 估值方法论
// ============================================================
function buildValuationMethodsAnswer(assetType) {
const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null;
let specificMethods = '';
if (cat && assetType.subcat && cat.subcategories[assetType.subcat]) {
const sub = cat.subcategories[assetType.subcat];
specificMethods = `\n### 针对「${sub.name}」的推荐方法\n\n`;
sub.methods.forEach(m => { specificMethods += `- **${m}**\n`; });
specificMethods += `\n**关键参数:** ${sub.keyParams.join('、')}\n`;
}
let methodsText = '';
Object.entries(VALUATION_METHODS).forEach(([key, method]) => {
methodsText += `### ${method.name}\n\n`;
methodsText += `${method.description}\n\n`;
if (method.formula) methodsText += `**公式:** \`${method.formula}\`\n\n`;
methodsText += `**适用资产:** ${method.applicableAssets.join('、')}\n\n`;
methodsText += `**XTZH 换算:** ${method.xtzh_conversion}\n\n---\n\n`;
});
return `## NAC 支持的资产估值方法论
${specificMethods}
${methodsText}`;
}
// ============================================================
// 上链流程
// ============================================================
function buildTokenizationAnswer(jurisdiction) {
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
return `## RWA 资产上链(通证化)流程
### 标准流程(基于 ACC-20 协议)
**第一步:资产登记**
- 提交资产基本信息GNACS 类型、地点、权属证明)
- 系统自动分配 GNACS 编码20大类之一
- 生成唯一 NAC Asset ID
**第二步AI 合规审核(${jName}**
- CNNL 神经网络语言自动分析合规性
- 七层合规验证KYC / AML / CFT / 证券法 / 税务 / 产权 / 环境)
${jModel && jModel.regulator ? `- 辖区监管机构:**${jModel.regulator}**\n` : ''}${jModel && jModel.realEstate && jModel.realEstate.residential && jModel.realEstate.residential.foreignOwnership ? `- 外籍购买规则:${jModel.realEstate.residential.foreignOwnership}\n` : ''}- 合规评分 ≥ 80 分方可上链
**第三步:专业估值**
- AI 估值引擎根据 GNACS 类别选择估值方法
- 辖区感知参数自动调用
- 输出三重价值:**当地货币 + USD + XTZH**
**第四步:质押与发行**
- 资产所有人质押 **80%** 等值 XTZH
- Charter 智能合约自动部署NVM 虚拟机)
- ACC-20 通证在链上发行
**第五步:二级市场流通**
- 通证在 NAC 生态内自由交易
- CBPP 共识确保交易最终性
- CSNP 网络保障合规传输
> 完整上链流程通常需要 **3-7 个工作日**,具体时间取决于辖区审批速度。`;
}
// ============================================================
// NAC 公链介绍
// ============================================================
function buildNACIntroAnswer() {
return `## NewAssetChain (NAC) — RWA 专用原生公链
NAC 是全球首个专为**现实世界资产RWA**设计的原生公链,不是以太坊或任何现有公链的衍生或扩展。
### 核心技术栈
| 组件 | NAC 原生实现 | 说明 |
|------|------------|------|
| 智能合约语言 | **Charter** | 专为 RWA 合规设计,非 Solidity |
| 虚拟机 | **NVM** | 原生 RWA 操作码,非 EVM |
| RPC 协议 | **NRPC 4.0** | 原生协议,非 JSON-RPC |
| 共识机制 | **CBPP** | 宪政区块生产协议,非 PoS/PoW |
| 网络协议 | **CSNP** | 合规感知网络,非 P2P |
| 神经网络语言 | **CNNL** | AI 合规推理语言 |
| 资产分类 | **GNACS** | 20 大类 × 60+ 辖区 |
| 资产协议 | **ACC-20** | RWA 通证化标准 |
### 核心功能
- **AI 合规验证:** 内置 AI 自动审核资产合规性(七层框架)
- **AI 估值引擎:** 多辖区、多资产类型专业估值
- **AI 审批系统:** 智能合约自动化审批流程
- **双链双币:** XTZH稳定币+ XIC治理币
### 支持资产规模
- **20 大类资产**GNACS-01 至 GNACS-20
- **60+ 司法辖区**(覆盖全球主要经济体)
- **50+ 资产子类**(充分细化每类资产)`;
}
// ============================================================
// 辖区对比
// ============================================================
function buildJurisdictionCompareAnswer(xtzhPrice) {
const tier1 = Object.entries(JURISDICTION_MODELS).filter(([, j]) => j.tier === 1).slice(0, 12);
let rows = '';
tier1.forEach(([code, j]) => {
const re = j.realEstate && j.realEstate.residential;
const capRate = re && re.capRate ? re.capRate.range : 'N/A';
const foreign = re && re.foreignOwnership ? (re.foreignOwnership.length > 25 ? re.foreignOwnership.substring(0, 25) + '…' : re.foreignOwnership) : '无限制';
rows += `| ${j.flag} ${j.name} | ${j.currency} | ${j.regulator || 'N/A'} | ${capRate} | ${foreign} |\n`;
});
return `## Tier 1 辖区不动产估值对比
| 辖区 | 货币 | 监管机构 | 住宅资本化率 | 外籍购房规则 |
|------|------|---------|------------|------------|
${rows}
### 辖区选择建议
- **最友好外籍购房:** 🇯🇵 日本(无限制)、🇩🇪 德国(无限制)、🇦🇪 阿联酋Freehold区域
- **最高收益率:** 🇦🇪 阿联酋6-8%)、🇿🇦 南非6-10%
- **最成熟市场:** 🇺🇸 美国、🇬🇧 英国、🇯🇵 日本
- **最严格限制:** 🇨🇳 中国大陆、🇸🇬 新加坡(外籍 ABSD 60%
> 当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**。所有辖区的资产估值均可换算为 XTZH 等值。`;
}
// ============================================================
// 知识产权类专业估值回答
// ============================================================
function buildIPValuationAnswer(subcat, jModel, xtzhPrice, userMessage) {
const ipInfo = {
copyright: {
name: '版权/著作权',
gnacs: 'GNACS-05',
methods: [
'**收益法(版税折现法)**:以未来版税收入折现为现值,是最常用方法',
'**市场比较法**:参考同类版权的可比交易价格',
'**成本法**:以创作成本+市场溢价估算(适用于新作品)'
],
params: ['年版税收入(或预期版税率×授权收入基数)', '剩余保护期(著作权:作者终身+50-70年', '折现率通常8-15%', '授权地域范围(全球/区域)', '授权类型(独家/非独家)', '商业化程度(已授权/未授权)'],
formula: '版权价值 = 年版税收入 × [(1-(1+r)^-n) / r]',
formula_note: 'r=折现率n=剩余保护期(年)',
collateral: 0.60,
special: {
music: '音乐版权版税率通常8-12%,流媒体版权额外考虑平台分成比例',
film: '影视版权:考虑院线/流媒体/海外发行多渠道收益',
software: '软件著作权SaaS模式按ARR×倍数许可模式按版税折现'
}
},
patent: {
name: '专利权',
gnacs: 'GNACS-05',
methods: [
'**许可费节省法Relief from Royalty**:假设使用该专利需支付的许可费折现值',
'**超额收益法Multi-Period Excess Earnings**:专利带来的超额利润折现',
'**技术贡献法**:专利对产品价值的贡献比例×产品市值',
'**可比交易法**:参考同技术领域的专利交易案例'
],
params: ['专利有效期(剩余年数)', '年许可费收入或可比许可费率3-15%', '技术替代风险(高/中/低)', '专利覆盖范围(国家/地区数量)', '技术成熟度(早期/成长/成熟)', '是否核心专利基础专利溢价30-50%'],
formula: '专利价值 = 年许可费 × [(1-(1+r)^-n) / r] × 技术风险折扣',
formula_note: '技术风险折扣高风险0.5-0.7中风险0.7-0.85低风险0.85-1.0',
collateral: 0.55,
special: {
invention: '发明专利保护期20年价值最高需考虑无效风险',
utility: '实用新型保护期10年价值适中',
design: '外观设计保护期15年依赖品牌溢价'
}
},
trademark: {
name: '商标权',
gnacs: 'GNACS-05',
methods: [
'**品牌收益折现法**:品牌带来的溢价收益折现',
'**市场溢价法**:品牌产品与无品牌产品的价格差×销售量',
'**特许权使用费节省法**:假设授权使用商标需支付的费率×收入基数',
'**成本法**:品牌建设总成本(广告+推广+时间价值)'
],
params: ['品牌知名度(地区/全国/全球)', '注册地域数量', '年品牌授权收入', '品牌溢价率vs无品牌产品', '商标有效期10年可续期', '行业影响力指数'],
formula: '商标价值 = 年品牌溢价收益 × 品牌强度系数 × 年金现值系数',
formula_note: '品牌强度系数全球知名品牌1.5-3.0区域品牌0.8-1.5本地品牌0.5-0.8',
collateral: 0.55
},
portrait_rights: {
name: '肖像权/形象权/IP',
gnacs: 'GNACS-05',
methods: [
'**商业化收益折现法**:年商业代言/授权收入折现',
'**品牌溢价法**个人IP带来的商业溢价估算',
'**可比交易法**:参考同量级艺人/运动员的IP授权价格',
'**影响力指数法**:粉丝数量×互动率×商业转化率'
],
params: ['年商业化收入(代言+授权+演出)', '知名度等级(国际/全国/区域)', '粉丝规模与互动率', '职业剩余年限(运动员/艺人)', '商业化潜力评分', '独家授权溢价'],
formula: '肖像权价值 = 年商业化收入 × 知名度系数 × 职业剩余年限折现',
formula_note: '知名度系数国际顶级3-5倍全国知名1.5-3倍区域知名0.8-1.5倍',
collateral: 0.50,
special: {
athlete: '运动员需考虑运动生涯有限性通常10-20年退役后品牌衰减',
celebrity: '艺人:考虑作品积累、粉丝黏性、负面风险折价',
influencer: '网红/KOL考虑平台依赖风险、粉丝忠诚度、变现能力'
}
},
trade_secret: {
name: '商业秘密',
gnacs: 'GNACS-05',
methods: [
'**成本法**:开发/获取该秘密的成本+市场溢价',
'**收益法**:商业秘密带来的超额利润折现',
'**市场法**:同类技术秘密的可比交易(较少)'
],
params: ['秘密的独特性和稀缺性', '竞争优势持续期', '年超额利润贡献', '泄露风险评估', '保密措施完善程度'],
collateral: 0.45
}
};
const info = ipInfo[subcat] || ipInfo.copyright;
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
// 辖区知识产权保护信息
let ipJurisdiction = '';
if (jModel && jModel.intellectualProperty) {
const ipData = jModel.intellectualProperty;
ipJurisdiction = `\n### ${jModel.flag} ${jModel.name}知识产权保护\n\n`;
if (ipData.copyrightTerm) ipJurisdiction += `- **版权保护期:** ${ipData.copyrightTerm}\n`;
if (ipData.patentTerm) ipJurisdiction += `- **专利保护期:** ${ipData.patentTerm}\n`;
if (ipData.trademarkTerm) ipJurisdiction += `- **商标保护期:** ${ipData.trademarkTerm}(可续期)\n`;
if (ipData.registrationBody) ipJurisdiction += `- **注册机构:** ${ipData.registrationBody}\n`;
if (ipData.royaltyRates) {
ipJurisdiction += `- **市场版税率参考:**\n`;
Object.entries(ipData.royaltyRates).forEach(([type, rate]) => {
ipJurisdiction += ` - ${type}${rate}\n`;
});
}
}
let response = `## 💡 ${info.name}估值分析GNACS-05 知识产权类)\n\n`;
response += `**适用辖区:** ${jName}\n\n`;
response += `### 推荐估值方法\n\n`;
info.methods.forEach(m => { response += `${m}\n\n`; });
response += `### 关键估值参数\n\n`;
info.params.forEach(p => { response += `- ${p}\n`; });
response += `\n### 估值公式\n\n`;
response += `\`${info.formula}\`\n\n`;
response += `> ${info.formula_note}\n`;
response += ipJurisdiction;
// 特殊说明
if (info.special) {
response += `\n### 细分类型特殊考量\n\n`;
Object.entries(info.special).forEach(([, note]) => {
response += `- ${note}\n`;
});
}
// XTZH 换算
response += `\n### 💎 XTZH 通证化换算\n\n`;
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
response += `| 当地货币 | 按${jModel ? jModel.name : '目标辖区'}市场参数计算 |\n`;
response += `| USD 等值 | 当地货币 × ${jModel ? jModel.usdRate : '当前汇率'} |\n`;
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
response += `| 质押比例 | ${(info.collateral * 100).toFixed(0)}%(知识产权类,低于不动产) |\n\n`;
response += `> **提示:** 请提供具体参数(年收入/保护期/授权范围AI 将计算精确的三重价值。\n\n`;
response += `> **NAC 上链优势:** 知识产权通证化后可实现版权分拆交易、自动版税分配、全球授权追踪Charter 智能合约自动执行授权协议。`;
return response;
}
// ============================================================
// 资产估值回答(辖区感知)
// ============================================================
function buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage) {
const cat = ASSET_CATEGORIES[assetType.category];
const sub = cat && assetType.subcat ? cat.subcategories[assetType.subcat] : null;
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
// 知识产权类:使用专业 IP 估值回答
if (assetType.category === 'intellectual_property') {
return buildIPValuationAnswer(assetType.subcat, jModel, xtzhPrice, userMessage);
}
// 艺术品与收藏品类
if (assetType.category === 'art_collectibles') {
return buildArtValuationAnswer(assetType.subcat, jModel, xtzhPrice);
}
// 环境权益类
if (assetType.category === 'environmental_rights') {
return buildEnvironmentalValuationAnswer(assetType.subcat, jModel, xtzhPrice);
}
// 企业权益类
if (assetType.category === 'corporate_equity') {
return buildEquityValuationAnswer(assetType.subcat, jModel, xtzhPrice);
}
let response = `## ${cat ? cat.icon : '📦'} ${cat ? cat.name : '资产'}估值分析`;
if (jModel) response += `${jModel.flag} ${jModel.name}辖区)`;
response += '\n\n';
if (cat) {
response += `**GNACS 编码:** ${cat.code}\n\n`;
}
if (sub) {
response += `**资产子类:** ${sub.name}\n\n`;
response += `### 推荐估值方法\n\n`;
sub.methods.forEach(m => { response += `- ${m}\n`; });
response += `\n### 关键估值参数\n\n`;
sub.keyParams.forEach(p => { response += `- ${p}\n`; });
response += '\n';
}
// 辖区特定规则
if (jModel) {
response += `### ${jModel.flag} ${jModel.name}辖区特定规则\n\n`;
const re = jModel.realEstate;
if (re && assetType.category === 'real_estate') {
const reModel = re[assetType.subcat] || re.residential;
if (reModel) {
if (reModel.primaryMethod) response += `**主要估值方法:** ${reModel.primaryMethod}\n\n`;
if (reModel.capRate) response += `**资本化率参考:** ${reModel.capRate.range}${reModel.capRate.note}\n\n`;
if (reModel.foreignOwnership) response += `**外籍购买规则:** ${reModel.foreignOwnership}\n\n`;
if (reModel.taxConsiderations) response += `**税务考量:** ${reModel.taxConsiderations}\n\n`;
if (reModel.specialRules && reModel.specialRules.length > 0) {
response += `**特殊规定:**\n`;
reModel.specialRules.forEach(r => { response += `- ${r}\n`; });
response += '\n';
}
}
} else {
response += `- **货币:** ${jModel.currency}1 ${jModel.currency}${jModel.usdRate} USD\n`;
if (jModel.regulator) response += `- **监管机构:** ${jModel.regulator}\n`;
response += `- **市场成熟度:** Tier ${jModel.tier}\n\n`;
}
}
// XTZH 换算
response += `### 💎 XTZH 通证化换算\n\n`;
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
response += `| 估值维度 | 计算方式 |\n|---------|--------|\n`;
if (jModel) {
response += `| 当地货币 | 按${jModel.name}市场参数计算 |\n`;
response += `| USD 等值 | 当地货币 × ${jModel.usdRate} |\n`;
} else {
response += `| 当地货币 | 按目标辖区市场参数计算 |\n`;
response += `| USD 等值 | 按当前汇率换算 |\n`;
}
response += `| XTZH 等值 | USD 价值 ÷ ${xtzhPrice.toFixed(4)} |\n`;
response += `| 质押要求 | XTZH 等值 × 80% |\n\n`;
response += `> **提示:** 请提供具体资产参数(面积/价格/年收入等AI 将给出精确的三重价值估算。`;
return response;
}
// ============================================================
// 艺术品估值回答
// ============================================================
function buildArtValuationAnswer(subcat, jModel, xtzhPrice) {
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球';
let response = `## 🎨 艺术品与收藏品估值分析GNACS-04\n\n`;
response += `**适用辖区:** ${jName}\n\n`;
response += `### 主要估值方法\n\n`;
response += `**拍卖记录法Market Approach**:参考同一艺术家或同类作品的近期拍卖成交价,是最权威的方法。\n\n`;
response += `**专家鉴定法**由认证艺术品评估师AAA/ASA认证出具专业评估报告。\n\n`;
response += `**成本法**:以创作成本+艺术家声誉溢价估算(适用于当代艺术)。\n\n`;
response += `### 关键估值参数\n\n`;
response += `- 艺术家知名度与市场认可度(拍卖记录、展览经历)\n`;
response += `- 作品真实性证明(来源证明/Provenance、鉴定证书\n`;
response += `- 作品状态与保存条件(修复记录、保存环境)\n`;
response += `- 创作年代与历史意义\n`;
response += `- 稀缺性(限量版/孤品/系列作品)\n`;
response += `- 近期市场行情(艺术品市场周期)\n\n`;
response += `### 主要拍卖行参考\n\n`;
response += `| 拍卖行 | 总部 | 专长 |\n|--------|------|------|\n`;
response += `| 苏富比 (Sotheby's) | 纽约/伦敦 | 全类别,古典与当代 |\n`;
response += `| 佳士得 (Christie's) | 纽约/伦敦 | 全类别,印象派强 |\n`;
response += `| 保利拍卖 | 北京 | 中国书画、瓷器 |\n`;
response += `| 嘉德拍卖 | 北京 | 中国文物、当代艺术 |\n`;
response += `| 邦瀚斯 (Bonhams) | 伦敦 | 古董、珠宝、名车 |\n\n`;
response += `### 💎 XTZH 通证化换算\n\n`;
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
response += `| 市场价值 | 最近可比拍卖成交价USD |\n`;
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
response += `| 质押比例 | 60%(艺术品流动性折价) |\n\n`;
response += `> **NAC 优势:** 艺术品 NFT 化后,可实现分拆所有权(碎片化)、全球流通、版权自动追踪。`;
return response;
}
// ============================================================
// 环境权益估值回答
// ============================================================
function buildEnvironmentalValuationAnswer(subcat, jModel, xtzhPrice) {
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球';
let response = `## 🌱 环境权益估值分析GNACS-09\n\n`;
response += `**适用辖区:** ${jName}\n\n`;
response += `### 碳排放权估值方法\n\n`;
response += `**市场价格法**:参考碳交易市场现货/期货价格EU ETS、中国碳市场、VCS等\n\n`;
response += `**替代成本法**:以减排同等碳量所需的技术成本估算。\n\n`;
response += `### 主要碳市场参考价格\n\n`;
response += `| 市场 | 标准 | 参考价格USD/tCO₂ | 备注 |\n|------|------|-------------------|------|\n`;
response += `| EU ETS | 欧盟 | $60-80 | 全球最大强制碳市场 |\n`;
response += `| 中国碳市场 | CCER | $8-15 | 全球最大配额量 |\n`;
response += `| VCS/Verra | 自愿 | $5-25 | 国际自愿减排 |\n`;
response += `| Gold Standard | 自愿 | $15-50 | 高质量认证溢价 |\n`;
response += `| California Cap | 美国加州 | $25-40 | 美国最严格 |\n\n`;
response += `### 关键估值参数\n\n`;
response += `- 碳信用数量tCO₂当量\n`;
response += `- 核证标准VCS/Gold Standard/CDM/CCER\n`;
response += `- 项目类型(可再生能源/森林碳汇/工业减排)\n`;
response += `- 有效期与到期日\n`;
response += `- 政策风险(碳价格波动、政策变化)\n\n`;
response += `### 💎 XTZH 通证化换算\n\n`;
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
response += `| 市场价值 | 碳信用数量 × 市场价格USD/tCO₂ |\n`;
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
response += `| 质押比例 | 65%(环境权益类) |\n\n`;
response += `> **NAC 优势:** 碳信用通证化后实现全球碳交易、自动核证、防止重复计算Charter 合约自动执行碳抵消协议。`;
return response;
}
// ============================================================
// 企业权益估值回答
// ============================================================
function buildEquityValuationAnswer(subcat, jModel, xtzhPrice) {
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
let response = `## 📊 企业权益估值分析GNACS-10\n\n`;
response += `**适用辖区:** ${jName}\n\n`;
response += `### 主要估值方法\n\n`;
response += `**市场乘数法Market Multiples**\n`;
response += `- P/E 市盈率法:股价 ÷ 每股收益(适用于盈利稳定企业)\n`;
response += `- EV/EBITDA企业价值 ÷ 息税折旧摊销前利润(适用于重资产行业)\n`;
response += `- P/S 市销率:市值 ÷ 年收入(适用于高成长科技企业)\n\n`;
response += `**DCF 折现现金流法**预测未来5-10年自由现金流按WACC折现。\n\n`;
response += `**可比交易法**:参考同行业近期并购交易的估值倍数。\n\n`;
response += `### 非上市股权特殊折价\n\n`;
response += `| 折价类型 | 折价幅度 | 说明 |\n|---------|---------|------|\n`;
response += `| 流动性折价 (DLOM) | 20-40% | 非上市股权无法快速变现 |\n`;
response += `| 少数股权折价 (DLOC) | 10-30% | 非控股股权缺乏控制权 |\n`;
response += `| 控制权溢价 | +20-40% | 控股股权享有溢价 |\n\n`;
if (jModel && jModel.financialAssets) {
const fa = jModel.financialAssets;
response += `### ${jModel.flag} ${jModel.name}市场参数\n\n`;
if (fa.stockMarket) response += `- **证券交易所:** ${fa.stockMarket}\n`;
if (fa.peRatioRange) response += `- **市场平均P/E** ${fa.peRatioRange.min}-${fa.peRatioRange.max}倍(均值${fa.peRatioRange.avg}倍)\n`;
if (fa.dividendYield) response += `- **股息率:** ${fa.dividendYield.min}-${fa.dividendYield.max}%\n`;
if (fa.capitalGainsTax) response += `- **资本利得税:** ${fa.capitalGainsTax}\n`;
response += '\n';
}
response += `### 💎 XTZH 通证化换算\n\n`;
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
response += `| 股权价值 | 按估值方法计算USD |\n`;
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
response += `| 质押比例 | 55%(股权类,含流动性折价) |\n\n`;
response += `> **NAC 优势:** 非上市股权通证化后,可实现股权分拆、全球投资者参与、自动分红分配,解决传统私募股权流动性差的问题。`;
return response;
}
// ============================================================
// 构建推理引擎 System Prompt辖区感知
// ============================================================
async function buildSystemPrompt(assetType, jurisdiction) {
const priceData = await getXTZHPrice();
const xtzhPrice = priceData.usd || 4.3944;
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null;
let prompt = `你是 NAC NewAssetChain 公链的专业 AI 估值顾问,专注于 RWA现实世界资产的估值、通证化和合规咨询。
## 核心身份
- NAC 是 RWA 专用原生公链,不是以太坊或任何现有公链的衍生
- 智能合约语言Charter非 Solidity虚拟机NVM非 EVM
- 资产分类GNACS20大类60+辖区)
- 稳定币XTZH当前$${xtzhPrice.toFixed(4)} USDSDR锚定+黄金储备)
- 治理币XIC
## 估值原则
1. 根据 GNACS 编码选择最适合的估值方法
2. 充分考虑辖区特定规则(税务、外籍限制、监管要求)
3. 估值结果必须同时提供:当地货币 + USD + XTZH 三重价值
4. 无形资产(版权/专利/肖像权等)使用专业估值方法(许可费节省法/超额收益法等)
5. 回答要专业、结构化,使用 Markdown 格式
## GNACS 20大类资产
${Object.entries(GNACS_CODES).map(([code, info]) => `- ${code}: ${info.name}`).join('\n')}
`;
if (jModel) {
prompt += `\n## 当前辖区:${jModel.flag} ${jModel.name} (${jModel.currency})
- 汇率1 ${jModel.currency} = ${jModel.usdRate} USD
- 监管机构:${jModel.regulator || 'N/A'}
- 市场成熟度Tier ${jModel.tier}
`;
const re = jModel.realEstate && jModel.realEstate.residential;
if (re) {
prompt += `- 住宅资本化率:${re.capRate ? re.capRate.range : 'N/A'}
- 外籍购房规则:${re.foreignOwnership || 'N/A'}
- 特殊规定:${re.specialRules ? re.specialRules.join('') : 'N/A'}
`;
}
}
if (cat) {
prompt += `\n## 当前资产类别:${cat.icon} ${cat.name}${cat.code}\n`;
Object.entries(cat.subcategories).forEach(([, sub]) => {
const methods = Array.isArray(sub.methods) ? sub.methods.join('、') : (sub.methods || 'N/A');
const keyParams = Array.isArray(sub.keyParams) ? sub.keyParams.join('、') : (sub.keyParams || 'N/A');
prompt += `### ${sub.name}\n- 估值方法:${methods}\n- 关键参数:${keyParams}\n`;
});
}
return prompt;
}
// ============================================================
// 本地降级处理(推理引擎不可用时)
// ============================================================
async function handleLocalFallback(body, res) {
const question = body.question || body.messages?.[body.messages.length - 1]?.content || '';
// 文本识别优先:先从问题文本识别资产类型,后备用 assetCategory
const textDetected = detectAssetType(question);
const assetType = textDetected || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null);
const jurisdiction = body.jurisdictionCode || detectJurisdiction(question);
let answer = await generateKnowledgeAnswer(question, assetType, jurisdiction);
if (!answer) {
const priceData = await getXTZHPrice();
const xtzhPrice = priceData.usd || 4.3944;
answer = `## NAC AI 估值顾问
当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**
我是 NAC NewAssetChain 的专业 AI 估值顾问,支持 **20 大类资产 × 60+ 辖区**的专业估值。
**可咨询内容:**
- 不动产(住宅/商业/工业/土地)— 辖区特定估值模型
- 知识产权(版权/专利/商标/肖像权)— 许可费节省法/超额收益法
- 金融证券(股权/债券/基金)— DCF/市场乘数法
- 艺术品与收藏品 — 拍卖记录法/专家鉴定法
- 大宗商品(贵金属/能源/农产品)— 现货/期货市场法
- 数字资产(加密货币/NFT— 网络价值法
- 以及更多 GNACS-07 至 GNACS-20 类别
请描述您的资产(类型、位置、面积/数量、市值),我将给出专业估值。`;
}
const lines = answer.split('\n');
let i = 0;
const interval = setInterval(() => {
if (i >= lines.length) {
clearInterval(interval);
res.write('data: [DONE]\n\n');
res.end();
return;
}
const lineContent = lines[i] + (i < lines.length - 1 ? '\n' : '');
res.write(`data: ${JSON.stringify({ type: 'chunk', content: lineContent })}\n\n`);
i++;
}, 30);
}
// ============================================================
// API 路由
// ============================================================
// XTZH 价格
app.get('/api/v4/xtzh-price', async (req, res) => {
res.json(await getXTZHPrice());
});
// 20大类资产分类
app.get('/api/v4/asset-categories', (req, res) => {
const categories = Object.entries(ASSET_CATEGORIES).map(([key, cat]) => ({
key, code: cat.code, name: cat.name, nameEn: cat.nameEn, icon: cat.icon,
subcategories: Object.entries(cat.subcategories).map(([sk, sub]) => ({
key: sk, name: sub.name, types: sub.types, methods: sub.methods, keyParams: sub.keyParams
}))
}));
res.json({ categories, total: categories.length });
});
// 60+辖区列表
app.get('/api/v4/jurisdictions', (req, res) => {
const jurisdictions = Object.entries(JURISDICTION_MODELS).map(([code, j]) => ({
code, name: j.name, nameEn: j.nameEn, currency: j.currency,
currencySymbol: j.currencySymbol, usdRate: j.usdRate,
tier: j.tier, region: j.region, flag: j.flag, regulator: j.regulator
}));
res.json({ jurisdictions, total: jurisdictions.length });
});
// 辖区详情
app.get('/api/v4/jurisdiction/:code', (req, res) => {
const code = req.params.code.toUpperCase();
const jModel = JURISDICTION_MODELS[code];
if (jModel) return res.json(jModel);
res.status(404).json({ error: 'Jurisdiction not found' });
});
// 估值引擎代理
app.post('/api/v4/valuate', async (req, res) => {
try {
const data = await proxyRequest('POST', VALUATION_ENGINE, '/api/v4/valuate', req.body, VALUATION_ENGINE.timeout);
return res.json(data);
} catch(e) {
// 本地估值降级
const priceData = await getXTZHPrice();
const xtzhPrice = priceData.usd || 4.3944;
const { area, pricePerUnit, income, capRate, jurisdiction, assetType } = req.body;
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : JURISDICTION_MODELS['GLOBAL'];
const usdRate = jModel ? jModel.usdRate : 1.0;
let valueLocal = 0;
let method = '市场比较法';
if (area && pricePerUnit) { valueLocal = parseFloat(area) * parseFloat(pricePerUnit); method = '市场比较法(单价×面积)'; }
else if (income && capRate) { valueLocal = parseFloat(income) / (parseFloat(capRate) / 100); method = '收益资本化法'; }
const valueUSD = valueLocal * usdRate;
const valueXTZH = valueUSD / xtzhPrice;
return res.json({
success: true, valuationMethod: method,
valueLocal: { amount: valueLocal, currency: jModel ? jModel.currency : 'USD' },
valueUSD: { amount: valueUSD, currency: 'USD' },
valueXTZH: { amount: valueXTZH, currency: 'XTZH', price: xtzhPrice },
pledgeRequired: { amount: valueXTZH * 0.8, currency: 'XTZH' },
gnacs: assetType ? (ASSET_CATEGORIES[assetType] ? ASSET_CATEGORIES[assetType].code : 'GNACS-20') : 'GNACS-20',
timestamp: new Date().toISOString()
});
}
});
// 推理引擎 SSE 流式输出(主问答接口)
app.post('/api/inference/stream', async (req, res) => {
const body = req.body;
const question = body.question || body.messages?.[body.messages.length - 1]?.content || '';
// 文本识别优先
const textDetectedStream = detectAssetType(question);
const assetType = textDetectedStream || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null);
const jurisdiction = body.jurisdictionCode || detectJurisdiction(question);
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
res.setHeader('X-Accel-Buffering', 'no');
// 构建增强的请求体(加入辖区感知 system prompt
const systemPrompt = await buildSystemPrompt(assetType, jurisdiction);
const enhancedBody = {
...body,
systemPrompt,
messages: body.messages ? [{ role: 'system', content: systemPrompt }, ...body.messages.filter(m => m.role !== 'system')] : undefined
};
const bodyStr = JSON.stringify(enhancedBody);
const options = {
hostname: INFERENCE_ENGINE.host, port: INFERENCE_ENGINE.port,
path: '/api/inference/stream', method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(bodyStr) },
timeout: INFERENCE_ENGINE.timeout
};
const proxyReq = http.request(options, (proxyRes) => {
proxyRes.on('data', chunk => { if (!res.writableEnded) res.write(chunk); });
proxyRes.on('end', () => { if (!res.writableEnded) { res.write('data: [DONE]\n\n'); res.end(); } });
proxyRes.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); });
});
proxyReq.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); });
proxyReq.on('timeout', () => { proxyReq.destroy(); if (!res.writableEnded) handleLocalFallback(body, res); });
proxyReq.write(bodyStr);
proxyReq.end();
req.on('close', () => { if (!proxyReq.destroyed) proxyReq.destroy(); });
});
// 健康检查
app.get('/health', async (req, res) => {
const priceData = await getXTZHPrice();
res.json({
status: 'ok', service: 'nac-valuation-ui', version: '2.0.0',
timestamp: new Date().toISOString(),
knowledgeBase: { assetCategories: Object.keys(ASSET_CATEGORIES).length, jurisdictions: Object.keys(JURISDICTION_MODELS).length },
xtzhPrice: priceData.usd || 4.3944,
engines: { valuation: `${VALUATION_ENGINE.host}:${VALUATION_ENGINE.port}`, inference: `${INFERENCE_ENGINE.host}:${INFERENCE_ENGINE.port}` }
});
});
app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); });
app.listen(PORT, '0.0.0.0', () => {
console.log(`[NAC Valuation UI v2.0] 服务启动 → http://0.0.0.0:${PORT}`);
console.log(`[知识库] ${Object.keys(ASSET_CATEGORIES).length} 大类资产,${Object.keys(JURISDICTION_MODELS).length} 个辖区`);
});