Arweave

Picasun ECNU_Jinggg

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”)

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” 消息,获取被删除的节点名称。
      • 遍历所有已注册的数据,检查每个数据条目中是否与被删除节点有关联。
      • 如果某个条目与该节点相关联,则将该条目标记为无效。

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”
      • 处理获取计算节点请求

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”
      • 获取所有的任务
  • 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.