【问题标题】:How to execute a task when a set of users have completed a task? Can this be done using nodejs and mongodb?当一组用户完成一项任务时,如何执行一项任务?这可以使用 nodejs 和 mongodb 来完成吗?
【发布时间】:2020-11-20 02:38:15
【问题描述】:

系统将为一组用户创建一个任务。当所有审阅者都完成任务后,需要调用区块链智能合约功能,这可以从服务器端完成。但我不确定如何为一组用户安排任务并等待他们完成。如何跟踪任务?这可以使用 nodejs 和 mongoDB 完成吗?

【问题讨论】:

  • 是的,可以做到。你把所有的任务作为新的文档放到mongodb的一个集合中。一旦用户完成了一个任务,你可以查询未完成的任务,当没有完成的时候,你可以调用你的智能合约。

标签: node.js event-handling blockchain smartcontracts


【解决方案1】:

以太坊智能合约的最简单变体如下。 这个过程是这样的:

  1. 每个任务的“主节点”创建一个智能合约“任务”,指定任务的名称、其描述(例如,带有描述的 URL 或 IPFS 清单文件)和查看者帐户列表。

  2. 其节点上的查看器捕获 TaskOpened 事件并分析任务

  3. 如果 Viewer 确认任务完成,则事务性地调用方法 AcceptTask,如果禁止,则调用方法 RejectTask

  4. 如果所有 Viewer 都确认任务完成,则在最后一个确认事件 TaskConfirmed 的时刻生成,捕获“主节点”和所有查看器

  5. 如果至少有一个 Viewer 禁止任务执行,则立即生成事件 TaskDeclined,捕获“主节点”和任何查看器

    pragma solidity >=0.5.2

    合约任务 { 地址所有者;

     bytes32    Name ;
     string     Description ;
     bytes32    State ;
    
     uint256     AnswersWaitCnt ;
    
     struct Viewer
     {
       bytes32  reply ;
       string   remark ;
     }
    
     mapping (address => Viewer) ViewersState ;
    
     event TaskAssigned (address viewer, bytes32 name, string description) ;
     event TaskConfirmed(bytes32 name) ; 
     event TaskDeclined (bytes32 name, address viewers, string remark) ; 
    
     constructor(bytes32 name_, string memory description_, address[] memory viewers_) public
    
     { 
         uint256  i    ;
    
               Owner= tx.origin ;
    
                Name= name_ ;
         Description= description_  ;
      AnswersWaitCnt= viewers_.length ;
    
               State="New"  ;
    
    
           for(i=0 ; i<viewers_.length ; i++) 
           {
               ViewersState[ viewers_[i] ]=Viewer({  reply: "wait", 
                                                    remark: ""      }) ;
    
                    emit TaskAssigned(viewers_[i], Name, Description) ; 
           }
     }
    
     function GetState() public view returns (bytes32, bytes32, string memory retVal)
     {
        return(Name, State, Description) ;
     }
    
     function AcceptTask() public
     {
         if( ViewersState[ tx.origin ].reply== 0x00 )  return ;
         if( ViewersState[ tx.origin ].reply!="wait")  return ;
    
             ViewersState[ tx.origin ].reply="accept" ;
    
                AnswersWaitCnt-- ;
    
         if(AnswersWaitCnt==0)
         {
               State="Confirmed"  ;
           emit TaskConfirmed(Name) ;
         }
     }
    
     function RejectTask(string memory remark_) public
     {
         if( ViewersState[ tx.origin ].reply== 0x00 )  return ;
         if( ViewersState[ tx.origin ].reply!="wait")  return ;
    
             ViewersState[ tx.origin ].reply ="deny" ;
             ViewersState[ tx.origin ].remark= remark_ ;
    
               State="Declined" ;
    
           emit TaskDeclined(Name, tx.origin, remark_) ;
     }
    

    }

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多