前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阐述区块链NFT铸造分红DAPP项目系统开发分析(成熟案例)

阐述区块链NFT铸造分红DAPP项目系统开发分析(成熟案例)

原创
作者头像
开发v_StPv888
发布2022-10-27 16:06:28
2770
发布2022-10-27 16:06:28
举报
文章被收录于专栏:makingmaking

一个NFT是一个token/凭证,有wei一的id和owner以及关联的其他数据,目前有经济价值的NFT项目的发行方式主要分两种形式,智能合约定制,羊了个羊链游模式定制,原生开发

一次性发行一个单独的项目并包含有限个NFT,它们共享一系列特性和数据,比如CryptoPunks

在一个公共的项目里创建一个自己的NFT,比如Foundation

一种经典的NFT(BAYC,CryptoPunk,…)

代码语言:javascript
复制
// 把g2o的定义放到前面
 32 typedef g2o::BlockSolver_6_3 SlamBlockSolver; 
 33 typedef g2o::LinearSolverCSparse< SlamBlockSolver::PoseMatrixType > SlamLinearSolver; 
 34 
 35 // 给定index,读取一帧数据
 36 FRAME readFrame( int index, ParameterReader& pd );
 37 // 估计一个运动的大小
 38 double normofTransform( cv::Mat rvec, cv::Mat tvec );
 39 
 40 // 检测两个帧,结果定义
 41 enum CHECK_RESULT {NOT_MATCHED=0, TOO_FAR_AWAY, TOO_CLOSE, KEYFRAME}; 
 42 // 函数声明
 43 CHECK_RESULT checkKeyframes( FRAME& f1, FRAME& f2, g2o::SparseOptimizer& opti, bool is_loops=false );
 44 // 检测近距离的回环
 45 void checkNearbyLoops( vector<FRAME>& frames, FRAME& currFrame, g2o::SparseOptimizer& opti );
 46 // 随机检测回环
 47 void checkRandomLoops( vector<FRAME>& frames, FRAME& currFrame, g2o::SparseOptimizer& opti );
 48 
 49 int main( int argc, char** argv )
 50 {
 51     // 前面部分和vo是一样的
 52     ParameterReader pd;
 53     int startIndex  =   atoi( pd.getData( "start_index" ).c_str() );
 54     int endIndex    =   atoi( pd.getData( "end_index"   ).c_str() );
 55 
 56     // 所有的关键帧都放在了这里
 57     vector< FRAME > keyframes; 
 58     // initialize
 59     cout<<"Initializing ..."<<endl;
 60     int currIndex = startIndex; // 当前索引为currIndex
 61     FRAME currFrame = readFrame( currIndex, pd ); // 当前帧数据
 62 
 63     string detector = pd.getData( "detector" );
 64     string descriptor = pd.getData( "descriptor" );
 65     CAMERA_INTRINSIC_PARAMETERS camera = getDefaultCamera();
 66     computeKeyPointsAndDesp( currFrame, detector, descriptor );
 67     PointCloud::Ptr cloud = image2PointCloud( currFrame.rgb, currFrame.depth, camera );
 68     
 69     /******************************* 
 70     // 新增:有关g2o的初始化
 71     *******************************/
 72     // 初始化求解器
 73     SlamLinearSolver* linearSolver = new SlamLinearSolver();
 74     linearSolver->setBlockOrdering( false );
 75     SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver );
 76     g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( blockSolver );
 77 
 78     g2o::SparseOptimizer globalOptimizer;  // 最后用的就是这个东东
 79     globalOptimizer.setAlgorithm( solver ); 
 80     // 不要输出调试信息
 81     globalOptimizer.setVerbose( false );
 82     
 83 
 84     // 向globalOptimizer增加第一个顶点
 85     g2o::VertexSE3* v = new g2o::VertexSE3();
 86     v->setId( currIndex );
 87     v->setEstimate( Eigen::Isometry3d::Identity() ); //估计为单位矩阵
 88     v->setFixed( true ); //第一个顶点固定,不用优化
 89     globalOptimizer.addVertex( v );
 90     
 91     keyframes.push_back( currFrame );
 92 
 93     double keyframe_threshold = atof( pd.getData("keyframe_threshold").c_str() );
 94 
 95     bool check_loop_closure = pd.getData("check_loop_closure")==string("yes");
 96     for ( currIndex=startIndex+1; currIndex<endIndex; currIndex++ )
 97     {
 98         cout<<"Reading files "<<currIndex<<endl;
 99         FRAME currFrame = readFrame( currIndex,pd ); // 读取currFrame
100         computeKeyPointsAndDesp( currFrame, detector, descriptor ); //提取特征
101         CHECK_RESULT result = checkKeyframes( keyframes.back(), currFrame, globalOptimizer ); //匹配该帧与keyframes里最后一帧
102         switch (result) // 根据匹配结果不同采取不同策略
103         {
104         case NOT_MATCHED:
105             //没匹配上,直接跳过
106             cout<<RED"Not enough inliers."<<endl;
107             break;
108         case TOO_FAR_AWAY:
109             // 太近了,也直接跳
110             cout<<RED"Too far away, may be an error."<<endl;
111             break;
112         case TOO_CLOSE:
113             // 太远了,可能出错了
114             cout<<RESET"Too close, not a keyframe"<<endl;
115             break;
116         case KEYFRAME:
117             cout<<GREEN"This is a new keyframe"<<endl;
118             // 不远不近,刚好
119             /**
120              * This is important!!
121              * This is important!!
122              * This is important!!
123              * (very important so I've said three times!)
124              */
125             // 检测回环
126             if (check_loop_closure)
127             {
128                 checkNearbyLoops( keyframes, currFrame, globalOptimizer );
129                 checkRandomLoops( keyframes, currFrame, globalOptimizer );
130             }
131             keyframes.push_back( currFrame );
132             break;
133         default:
134             break;
135         }

基础数据构成

开发者个人钱包或者DAO的钱包发起交易,创建一个ERC721合约,它长这样:

NFT合约里包含什么信息

1.每个token的owner和url

2.实现权限的逻辑,谁可以改合约数据,比如url

项目方权限越小就越去中心化

3.实现transfer和mint的逻辑

transfer是ERC721的接口规范,逻辑大家都一样,mint一般会加一些特别限制

4.实现取钱(withdraw)逻辑,从合约里把钱转到指定账户

一般是项目方个人钱包或者DAO钱包。

什么是mint(铸造)?

合约刚刚部署/创建的时候,合约的数据里面是没有token的,创建一个token的过程就是mint,其实就是在数据库里面新增了一条数据。一般是用户支付给合约一笔钱然后合约生成一个token并且把owner设置成这个用户。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档