Arweave
Smart Contract
内容
- message
- Id(这是消息中携带的数据标识符)
- Tags
- DataId(用于标识与消息内容相关的数据)
- Price
- price
- symbol
- Name
- Error
- userData
- Datastatus
- Address
- Desc(相关描述)
- ComputeNodes
- Data
- From
- Timestamp
base.lua(3 functions)
- DATA_PROCESS_ID
- 数据管理的节点ID(公钥)
- NODE_PROCESS_ID
- 节点管理的节点ID(公钥)
- 需要写入PROCESS_DATA_ID和PROCESS_NODE_ID
- **findIndex(list, element) **
- 在list中找element的索引并返回
- 归一化响应
- **sendErrorResponse(request, errorMessage) **
- sendSuccessResponse(request, responseData)
- 如在dataregistry中,检查 DataTag 是否存在
- if message.Tags.DataTag == nil then
- sendErrorResponse(message, “DataTag is required”)
- if message.Tags.DataTag == nil then
- 如在dataregistry中,检查 DataTag 是否存在
dataregistry.lua
初始化数据存储
- RegisteredData = RegisteredData or {} – 存储所有注册的数据
- AwaitingData = AwaitingData or {} – 存储待处理的数据
- SymbolList = SymbolList or {} – 存储支持的价格代币
initializeDataRegistry()
- 在代币列表中加入AOCRED和war(原生or测试代币)
isSymbolSupported(symbol)
- 检查代币是否被支持(是否在代币列表中)
extractInitialKey(message)
- 获取消息的初始数据键
extractExistingKey(message)
- 获取消息的现有数据键
handlers⭐️
- “register”
- 需要检查tags是否齐全,以及Price标签的price 和symbol是否齐全
- 检查是否已经注册
- 将数据添加到待处理数据中
- 向ao发送请求以获取计算节点
- “getComputeNodesSuccess”
- 处理获取计算节点成功的响应
- “getComputeNodesError”
- 处理获取计算节点错误的响应
- “getDataById”
- 处理按 ID 获取数据的请求
- “delete”
- 处理删除数据的请求
- “allData”
- 处理获取所有数据的请求
- 返回RegisteredData表
- “deleteNodeNotice”(会在节点成功删除时被调用)
- 处理节点删除通知,流程如下:
- 收到 “DeleteNodeNotice” 消息,获取被删除的节点名称。
- 遍历所有已注册的数据,检查每个数据条目中是否与被删除节点有关联。
- 如果某个条目与该节点相关联,则将该条目标记为无效。
- “register”
noderegistry.lua
- NODE_MANAGER = NODE_MANAGER or ao.env.Process.Owner
- 节点管理(比如添加白名单操作就需要)
- NodeList = NodeList or {}
- 节点列表
- Whitelist = Whitelist or {}
- 白名单节点列表
- CurrentNodeIndex = CurrentNodeIndex or 0
- 节点索引列表
- extractNodeKey(msg)
- 获取节点的键 返回tags.name
- handlers⭐️
- “addWhitelistEntry”
- 处理添加白名单请求,流程如下:
- 验证消息中是否包含地址字段。
- 确认请求来源是否是 NODE_MANAGER。
- 检查地址是否已存在于白名单中。
- 将地址添加到白名单(如果地址是新的)。
- 向消息发送者发送相应的成功或错误反馈。
- “retrieveWhitelist”
- 处理获取白名单请求
- “removeWhitelistEntry”
- 处理移除白名单请求
- “registerNode”
- 处理节点注册请求
- “updateNode”
- 处理节点更新请求
- “deleteNode”
- 处理节点删除请求
- “listNodes”
- 处理获取所有节点请求
- “fetchNodeByName”
- 处理根据名称获取节点请求
- “retrieveComputeNodes”
- 处理获取计算节点请求
- “addWhitelistEntry”
tasks.lua
– 初始化 Token 处理 ID 表,如果已经存在则保留原有值
TOKEN_PROCESS_ID = TOKEN_PROCESS_ID or {}
代币-合约地址
– 初始化计算价格表,如果已经存在则保留原有值
COMPUTATION_PRICE = COMPUTATION_PRICE or {}
– 设置报告超时时间,如果没有设置则默认为 60 秒
REPORT_TIMEOUT = REPORT_TIMEOUT or 60 * 1000 – 超时时间单位为毫秒
– 初始化已完成任务的表,如果已经存在则保留原有值
CompletedTasks = CompletedTasks or {}
– 初始化待处理任务的表,如果已经存在则保留原有值
PendingTasks = PendingTasks or {}
– 初始化自由余额的表,如果已经存在则保留原有值
FreeAllowances = FreeAllowances or {}
– 初始化锁定余额的表,如果已经存在则保留原有值
LockedAllowances = LockedAllowances or {}
– 初始化信用通知表,如果已经存在则保留原有值
CreditNotice = CreditNotice or {}
– 初始化借记通知表,如果已经存在则保留原有值
DebitNotice = DebitNotice or {}
– 初始化转账错误通知表,如果已经存在则保留原有值
TransferErrorNotice = TransferErrorNotice or {}
initializeJobEnvironment
- 初始化任务环境,针对aocred 和 war两个代币
- 设置计算成本
findPriceSymbolByProcessId(processId)
- 根据代币合约ID返回代币
getTokenProcessId(priceSymbol)
- 根据代币返回合约地址
getInitialTaskKey(message)
- 获取消息的id
getExistingTaskKey(message)
- 获取消息中相关数据的id
getAllowanceKey(address, priceSymbol)
- 生成一个唯一的键值,格式为 “address:priceSymbol”
getTaskList(tasks)
- 将任务表转换为一个新的任务列表
calculateRequiredTokens(computeNodeCount, dataPrice, priceSymbol)
- 计算所需的代币数量
**checkReportTimeout(now)**??????
- 检查挂起任务的超时状态
- 如果超时且报告次数达到阈值,完成任务
handlers
- “computationPrice”
- 返回代币计算价格
- “reportTimeout”
- 超时响应
- “CheckReportTimeout”
- 检察任务超时情况 调用(checkReportTimeout(now))
- “creditNotice”
- 从消息中获取信息:获取价格符号、发件人地址和通知中的数量。
- 记录信用通知:创建一个包含数量、时间戳和价格符号的信用通知对象,并将其添加到 CreditNotice 表中,以发件人地址为键。
- 更新自由余额:根据通知中的数量,更新 FreeAllowances 表中相应的自由余额。
- “debitNotice”
- 从消息中提取信息:获取价格符号、接收者地址和通知中的数量。
- 记录借记通知:创建一个包含数量、时间戳和价格符号的借记通知对象,并将其添加到 DebitNotice 表中,以接收者地址为键。
- “Notice”
- 确定目标地址:从消息中获取目标地址。如果消息中指定了地址,则使用该地址,否则使用消息中的 From 字段。
- 收集通知信息:从 CreditNotice 和 DebitNotice 表中获取与目标地址相关的借记和贷记通知。
- 回复消息:将收集到的通知信息作为响应发送回去。
- “transferError”
- 往TransferErrorNotice插入信息
- “allowance”
- 根据请求的 PriceSymbol 返回指定用户的自由余额和锁定余额
- “withdraw”
- 它处理提现请求,检查余额并执行相应的转账操作
- “submit”
- 处理任务提交请求,验证必要参数,初始化任务记录,发送相关请求以获取计算节点和数据,并检查任务是否超时
- “getComputeNodesSuccess”
- 处理计算节点成功返回后的逻辑,更新任务的状态,检查代币余额是否足够,并相应地更新任务状态和回复消息。
- “getPendingTasks”
- 获取所有待处理任务
- “getCompletedTaskById”
- 通过ID获得已经完成的任务
- “reportResult”
- 处理计算节点提交的结果报告,验证节点信息和数据,并在所有节点都报告后完成任务。
- “getCompletedTasks”
- 获取所有已经完成的任务
- “getAllTasks”
- 获取所有的任务
- “computationPrice”
completeTask(taskKey)
- 完成了任务处理,执行了代币的转账,并在任务完成后更新相关的任务状态和代币信息。
server
aos padodata1
aos padonode1
aos padotask1
padouser1
aos pado_usr1
aos 节点
padodata1:FioTCXlbEHJjSwfUsb5VR66KsB2LWxWaLrb18Da5ij4
padadata2 : tyZVsDZ1BEDJ_55UwrqG33xq68-oeLff5SkCFxyTz24
padonote1:1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0
padouser1:lAo8AB8xHHIiR1JQkuTMvxzzy9D5ncehgBgrdjpYUhg
pado_usr1:LaD0rlPDLQXUhSQF55cdsXNJkZqJXWxg-MNlzgyvxQo
pado_usr2:pcK4jkHyJuOx6pAxc2xOB8YUHLgjD4QLM408JcfGUb4
结点
Data就是公钥
获取白名单()
- Send({Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv- lC81oBb0”,Action=”GetWhiteList”})
- 返回到msg.data
添加白名单
- Send({Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”,Action=”AddWhiteList”,Tags={Address=”LaD0rlPDLQXUhSQF55cdsXNJkZqJXWxg-MNlzgyvxQo”}})
- 需要Target Action Tags.Address
注册节点
- Send({Action=”Register”,Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”,Data=”LaD0rlPDLQXUhSQF55cdsXNJkZqJXWxg-MNlzgyvxQo”,Tags={Name=”Usr1”,Desc=”i m test”}})
- 要在白名单内 数据是公钥 Tag要有Name(就是NodeKey)和Desc
- 需要Action Target Data Tags.Name Tags.Desc
更新节点
- Send({Action=”Update”,Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”,Data=”LaD0rlPDLQXUhSQF55cdsXNJkZqJXWxg-MNlzgyvxQo”,Tags={Name=”Usr1”,Desc=”i m test new new new”}})
- 只能更新Desc部分,
- 需要Action Target Tags.Name 新的Tags.Desc
删除节点
- Send({Action=”Delete”,Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”,Tags={Name=”Usr2222”}})
- 需要Action Target Tags.Name
获取节点所有数据
- Send({Action=”Nodes”,Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”})
- 需要Target Action 返回的就是Nodes合约环境下的Nodes所有参数
- 返回值为JSON 要从Inbox[#Inbox].Data
通过Tags.name获得节点数据
- Send({Action=”GetNodeByName”,Target=”1U1Kn214JNRc96C93ASKzVbhpc0HbxMvFv-lC81oBb0”,Tags={Name=”Usr2222”}})
- 需要Action Target Tags.Name
数据
- 全局变量( x k n l nc nk )
- Send({Action=”Addx”,Target=”tyZVsDZ1BEDJ_55UwrqG33xq68-oeLff5SkCFxyTz24”,Tags={Name=”X”,Desc=”7”}})
- 此时nc nk k n都会赋值好
- 数据注册
- Send({Action=”Register”,Target=”tyZVsDZ1BEDJ_55UwrqG33xq68-oeLff5SkCFxyTz24”,Tags={Name=”like”,Desc=”syww”}})
- Name放数据的名称
- Desc放数据的值
用户
- 注册
Send({Action="Register",Target="lAo8AB8xHHIiR1JQkuTMvxzzy9D5ncehgBgrdjpYUhg",Data="Xiechenxiang_PK",Tags={Name="szqq",Desc="woshishabi"}})
- Data放公钥 名字就是用户名 Desc放属性集
- 获得全部人员信息
- Send({Action=”Users”,Target=”lAo8AB8xHHIiR1JQkuTMvxzzy9D5ncehgBgrdjpYUhg”})
- 通过Index获得人员信息
- Send({Action=”GetUserByIndex”,Target=”lAo8AB8xHHIiR1JQkuTMvxzzy9D5ncehgBgrdjpYUhg”,Tags={Index=”1”}})
- 通过Name获得人员信息
- Send({Action=”GetUserByName”,Target=”lAo8AB8xHHIiR1JQkuTMvxzzy9D5ncehgBgrdjpYUhg”,Tags={Name=”yanghao”}})
- Post title:Arweave
- Post author:Picasun
- Create time:2024-09-06 13:09:09
- Post link:https://redefine.ohevan.com/2024/09/06/Arweave/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.