AMA Protocol的RPC代理与CORS:前端DApp直连节点的配置方法
发布时间:2026/8/21 18:32:25 作者:尧图编辑部 阅读量:1,286

AMA Protocol的RPC代理与CORS前端DApp直连节点的配置方法【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node在区块链开发中前端DApp直接调用链上节点是常见的需求而RPC代理与**CORS跨域资源共享**往往是开发者最先遇到的拦路虎。AMA Protocol 的开源节点node项目内置了一套完整的 HTTP RPC 网关天然支持 CORS 预检与跨域响应头配合简单的环境变量即可完成RPC代理配置让浏览器里的 DApp 无缝直连节点查询余额、读取链上数据、提交交易。本文面向新手用最少的代码带你完成整套配置。 一、为什么前端DApp需要RPC代理与CORS浏览器有同源策略Same-Origin Policy页面只能访问同源的接口。当你的 DApp 部署在https://app.example.com而节点 RPC 服务在http://192.168.1.10:80时浏览器会直接拦截跨域请求报错形如Access to fetch at http://node-ip:80/api/... has been blocked by CORS policy解决办法有两个方向方案说明适用场景服务端开启 CORS节点在响应中携带Access-Control-Allow-Origin等头浏览器放行官方公共RPC、自建节点对外服务自建 RPC 代理同域反向代理转发请求规避跨域内网节点、不想暴露端口AMA Protocol 的节点把这两者都做到了自带 CORS 响应头 内置 RPC 代理转发前端几乎零成本接入。 二、节点自带的 HTTP RPC 网关AMA Protocol 节点内置了一个轻量级 HTTP 多路复用服务ex/lib/http/multiserver.ex监听 HTTP 请求并按路径分发到各 API 模块GET /api/wallet/balance/{pk}/{symbol}— 查询账户余额GET /api/chain/tip、/api/chain/tx/{txid}— 查询链信息与交易GET /api/contract/view/{contract}/{function}— 调用合约只读方法POST /api/tx/submit、/api/tx/submit_and_wait— 提交交易含等待最终确认GET /ws/rpc— WebSocket RPC支持升级GET /health、/metrics— 健康检查与监控指标所有响应都通过Photon.HTTP.Response.build_cors/4统一附加 CORS 头也就是说节点返回的每个 JSON 都天然允许跨域访问前端直接 fetch 即可。⚙️ 三、最快配置方法三个环境变量搞定 RPC 代理节点通过环境变量控制 HTTP 服务与上游代理全部定义在 runtime.exs 中环境变量默认值作用HTTP_IPV40.0.0.0HTTP RPC 服务监听地址HTTP_PORT80HTTP RPC 服务监听端口RPC_URLhttps://mainnet-rpc.ama.one上游 RPC 地址代理转发目标启动一个对外提供 RPC 服务的节点只需HTTP_IPV40.0.0.0 HTTP_PORT80 RPC_URLhttps://mainnet-rpc.ama.one ./amadeusd如果你想跑本地测试网把 RPC 指向自己README 中的官方做法# 把域名指向本地 vim /etc/hosts 127.0.0.1 nodes.amadeus.bot # 允许监听 80/443 端口 sudo sysctl -w net.ipv4.ip_unprivileged_port_start80 # 启动本地测试网 TESTNETtrue WORKFOLDER/tmp/testnet HTTP_IPV4127.0.0.1 HTTP_PORT80 ./amadeusd监听非特权端口如8080可省去sysctl步骤前端配合下方 CORS 配置即可直连。 四、CORS 是如何被处理的前端直连的关键1. 预检请求OPTIONS自动应答浏览器在发起跨域POST/自定义头请求前会先发一个OPTIONS预检。节点在handle_http/1中专门处理了OPTIONS与HEAD方法r.method in [OPTIONS, HEAD] - :ok :gen_tcp.send(state.socket, Photon.HTTP.Response.build_cors(state.request, 200, %{}, ))即预检直接返回 200 CORS 头无需任何额外配置。2. 每个响应都带 CORS 头无论是普通 JSON 响应、WebSocket 升级、Prometheus 指标还是代理转发的上游内容统一走build_cors/4保证前端拿到的每个包都包含Access-Control-Allow-Origin等头。3. 空结果自动转发上游dumb-proxy 模式这是 AMA 节点 RPC 代理的精髓当本地节点因裁剪pruner等原因没有历史数据时reply_or_proxy/3会把请求原样转发给上游 RPC并把上游状态码与响应体透传回来前端无感知defp reply_or_proxy(state, r, result) do if empty_response?(result) do proxy_get(state, r) # 本地无数据 → 代理到 RPC_URL else quick_reply(state, result) # 本地有数据 → 直接返回 end end这意味着无论数据在本节点还是上游前端 DApp 永远只面对一个同源地址跨域问题被彻底封装。 五、前端 DApp 直连节点的完整配置步骤以查询余额为例前端代码只需要一个fetch// 查询 AMA 余额 const res await fetch(${RPC_BASE}/api/wallet/balance/${pk}/AMA); const data await res.json();完整落地步骤清单获取节点地址公网节点用https://mainnet-rpc.ama.one自建节点用http://你的IP:端口。确认 CORS 生效浏览器开发者工具 → Network查看响应头是否包含Access-Control-Allow-Origin: *。配置 RPC 代理可选若前端与节点不同域且有代理服务如 Nginx把/api/与/ws/rpc转发到节点端口即可。WebSocket 长连接需要实时推送时连接ws://节点地址/ws/rpc节点同样处理了升级握手与 CORS。提交流程先POST /api/contract/validate校验合约再POST /api/tx/submit提交打包后的交易或用submit_and_wait?finalizedtrue等待最终确认。本地联调跑一个TESTNETtrue的本地节点把 RPC 指向127.0.0.1配合浏览器无 CORS 模式快速调试详见仓库 README.md。️ 六、常见问题与排错指南症状原因解决办法浏览器报 CORS 错误访问的是第三方 RPC 或代理未透传头改用官方 RPC或自建节点用默认网关直连返回 404 且本地有数据路径写错对照multiserver.ex中/api/...路由逐一核对返回 429触发限流节点按 IP 限流如/api/upow/seed每分钟100次降低请求频率payload_too_large请求体超限默认上限 1MB交易提交接口上限为tx_size * 2请求超时节点空闲超时60秒检查网络与节点状态长查询改用轮询✅ 总结AMA Protocol 的节点把RPC 代理 CORS封装成了一套零配置的默认能力响应自带跨域头、OPTIONS 预检自动应答、本地无数据自动转发上游。前端 DApp 开发者只需拿到节点 HTTP 地址就能用普通fetch完成余额查询、合约调用与交易提交彻底告别跨域配置噩梦。需要本地联调时参考 README.md 的 Testnet 章节或用HTTP_IPV4/HTTP_PORT/RPC_URL三个环境变量自定义你的 RPC 服务形态。相关源码速览HTTP 网关与代理分发ex/lib/http/multiserver.exRPC 客户端与上游请求ex/lib/api/rpc_api.ex环境变量定义ex/config/runtime.exs节点启动与监听ex/lib/ex.ex【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考