以太坊DApps去中心化微博开发(使用truffle框架)

1.创建项目

我们使用的是Truffle框架
Truffle是一套针对基于以太坊的Solidity语言开发框架,本身基于javascript,Truffle为以太坊提供了开发环境,测试框架和资产管道(pipeline)。
安装truffle
npm install -g truffle@3.4.11

创建并初始化项目
mkdir eth-weibo
git clone http://github.com/truffle-box/bare-box

2.合约

2.1 WeiboAccount合约

WeiboAccount合约存储发送的微博内容,每一个微博账户对应一个WeiboAccount合约,WeiboAccount合约的所有者是合约的创建者,所以你的微博只能由自己管理,没有任何一个机构可以删除你自己的合约

WeiboAccount包含以下几个功能:

  • 发送微博
  • 查找微博
  • 打赏

具体实现如下:

pragma solidity ^0.4.10;

/**
	微博账户
*/

contract WeiboAccount{
	//data structure of a single Weibo
	struct Weibo{
		uint timestamp;
		string weiboString;
	}

	//这个微博账户的所有微博,微博ID映射微博内容
	mapping(uint => Weibo) _weibos;

	//账户发的微博数量
	uint _numberOfWeibos;

	//微博账户的所有者
	address _adminAddress;
	// 权限控制,被这个修饰符修饰的方法,表示该方法只能被微博所有者操作
	modifier onlyAdmin{
		require(msg.sender==_adminAddress);
		_;
	}

	//微博合约的构造方法
	function WeiboAccount(){
		_numberOfWeibos=0;
		_adminAddress=msg.sender;
	}

	//发新微博
	function weibo(string weiboString) onlyAdmin{
		require(bytes(weiboString).length<=160);
		_weibos[_numberOfWeibos].timestamp=now;
		_weibos[_numberOfWeibos].weiboString=weiboString;
		_numberOfWeibos++;
	}

	//根据ID查找微博
	function getWeibo(unit weiboId) constant returns (string weiboString,uint timestamp){
		weiboString=_weibos[weiboId].weiboString;
		timestamp=_weibo[weiboId].timestamp;
	}

	//返回最新的一条微博
	function getLatestWeibo() constant returns (string weiboString,uint timestamp,unit numberOfWeibos){
		weiboString=_weibos[_numberOfWeibos-1].weiboString;
		timestamp=_weibos[_numberOfWeibos-1].timestamp;
		numberOfWeibos=_numberOfWeibos;
	}	
	
	//返回微博所有者
	function getOwnerAddress() constant returns(address adminAddress){
		return _numberOfWeibos;
	}


	//取回打赏
	function adminRetrieveDonations(address receiver) onlyAdmin{
		assert(receiver.send(this.balance));
	}

	//摧毁合约
	function adminDeleteAccount() onlyAdmin{
		selfdestruct(_adminAddress);
	}

	//记录每条打赏记录
	event LogDonate(address indexed from,uint _amount);


	//接受别人的打赏
	function() payable{
		LogDonate(msg.sender,msg.value);
	}
	//返回微博账户总数
	function getNumberOfWeibos() constant returns(uint numberOfWeibos){
		return _numberOfWeibos;
	}
}

2.2 WeiboRegistry合约

WeiboRegistry合约提供展示微博账号的平台,在weiboRegistry维护这账户昵称,账户ID到weiboAccount合约之间的映射关系,主要有以下几个功能:

  • 注册微博
  • 返回已注册账户数量
  • 查找微博账户
  • 打赏
    具体实现如下:
pragma solidity ^0.4.10;

/**
	微博管理平台
*/

contract WeiboRegister{
    //根据用户昵称,ID,地址查找微博账户
    mapping (address=>string) _addressToAccountName;
    mapping(uint => address) _accountIdToAccountAddress;
    mapping(string=>address) _accountNameToAddress;
    
    //平台上的注册数量
    uint _numberOfAccounts;
    
    //微博平台管理员
    address _registryAdmin;
    
    //权限控制,被这个修饰符修饰的方法,表示该方法只能被微博平台管理员操作
    modifier onlyRegistryAdmin{
        require(msg.sender==_registryAdmin);
        _;
    }
    
    
    //微博平台构造函数
    function WeiboRegister(){
        _registryAdmin=msg.sender;
        _numberOfAccounts=0;
    }
    
    
    //在平台上注册微博:用户名,微博账户
    function register(string name,address accountAddress){
        //账户之前没有注册过
        require(_accountNameToAddress[name]==address(0));
        //昵称之前未注册过
        require(bytes(_addressToAccountName[accountAddress]).length==0);
        //昵称不能超过64字符
        require(bytes(name).length<64);
        _addressToAccountName[accountAddress]=name;
        _accountNameToAddress[name]=accountAddress;
        _accountIdToAccountAddress[_numberOfAccounts]=accountAddress;
        _numberOfAccounts++;
    }
    
    //返回已注册账户数量
    function getNumberOfAccounts() constant returns (uint numberOfAccounts){
        numberOfAccounts=_numberOfAccounts;
    }
    
    //返回昵称对应的微博账户地址
    function getAddressOfName(string name) constant returns(address addr){
        addr=_accountNameToAddress[name];
    }
    
    //返回与微博账户对应的昵称
    function getNameOfAddress(address addr)  constant returns(string name){
        name=_addressToAccountName[addr];
    }
    
    //根据Id返回账户
    function getAddressOfId(uint id) constant returns(address addr){
        addr=_accountIdToAccountAddress[id];
    }
    
    //取回打赏
    function adminRetrieveDonations() onlyRegistryAdmin{
        assert(_registryAdmin.send(this.balance));
    }
    
    //摧毁合约
    function adminDeleteRegistry() onlyRegistryAdmin{
        selfdestruct(_registryAdmin);
    }
    
    //记录每条打赏记录
    event LogDonate(address indexed from,uint256 _amount);
    
    
    //接受别人的打赏
    function() payable{
        LogDonate(msg.sender,msg.value);
    }
}

3.部署合约

在truffle中只需要部署WeiboRegister合约就可以了,WeiAccount合约可以通过前端页面部署。在部署WeiboRegistry合约之前需要编写迁移脚本,具体如下:
文件 2_weiboregistry_migration.js:

var WeiboRegistry=artifacts.require("WeiboRegister");
module.exports=function(deployer){
	deployer.deploy(WeiboRegistry);
}

迁移脚本完成后,就可以执行迁移命令了
这里是将智能合约部署到Testrpc环境中。
安装Testrpc环境

npm install -g ethereumjs-testrpc

启动testrpc

testrpc

执行迁移命令:

truffle migrate 

以下说明成功:

Compiling ./contracts/WeiboRegistry.sol… Writing artifacts to
./build/contracts

Using network ‘development’.

Running migration: 2_weiboregistry_migration.js Deploying
WeiboRegister… …
0x0642a947b1d4baaa834f88961a4097537a8e1ce0a9c046e5fc77dd9d19b93bef
WeiboRegister: 0xab3fed12e76473334a801cc5252a48d7437247e2 Saving
successful migration to network… …
0x441972c747810af18818442514afc9a4634dfd21c07ce18df71738a2c6e8df55
Saving artifacts…

4. 前端应用

为了能够在前端JavaScript代码中使用Truffle提供的合约抽象,需要truffle-default-builder,truffle-default-builder可以帮助我们把合约抽象整合到JavaScript脚本中。运行以下命令安装truffle-default-builder。

cd eth-weibo
npm init -y
npm install --save truffle-default-builder@2.0.0

安装完成后,需要在truffle.js中配置一下,文件truffle-config.js:

var DefaultBuilder=require("truffle-default-builder");

module.export={
	build:new DefaultBuilder({
		"index.html":"index.html",
		"app.js":[
			"javascripts/app.js"
			],
		"app.css":[
			"stylesheets/app.css"
			],
		}),
		networks:{
			development:{
				host:"localhost",
				port:8545,
				network_id:"*" //match any networkid
				}
			}
		};

配置完成后执行build命令,在build文件下会生成app.js

truffle build

如果出现以下错误:

Error: Couldn't find file at .//app/javascripts/app.js. 

可以根据下面的callback查找node_modules/truffle-default-builder/index.js文件
我将index.js中的280修改如下后即可:

var display_path = expected_path.replace(this.working_directory, ".");

如果出现以下错误:

 Couldn't find file at ./app/stylesheets/app.css. 

手动创建文件即可

build/app.js提供了以下几个全局变量,在app.js文件中任意位子使用这几个全局变量

  • web3对象
  • WeiboAccount和WeiboRegistry合约抽象
    truffle-default-builder可以让开发者专注于前端业务逻辑,不需要担心ES6,ES7规范与浏览器规范之间的区别,它会自动作转换。
    所有前端脚本位于app/javascript/app.js文件中,前端页面逻辑主要功能如下:
  • 生成微博账号
  • 在微博中注册昵称
  • 发送微博
  • 展示微博内容
  • 显示打赏金额
    具体实现如下,app.js
    //部署好weiboRistry

5.运行DAPP

这里使用的是testrpc,启动testrpc。启动后可以看到一些地址和私钥
打开谷歌浏览器(需要先安装metamask插件)
打开metamask插件,然后将网络切换到localhost:8545
将testrpc中提供的私钥选择一个导入到metamask账户中

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开篇先讲两个小故事故事一:在北京一家创业公司工作的年轻女白领是一个旅行爱好者,喜欢旅行并分享到微博上。趁着五一假期到泰国旅游,她拍摄了一组照片分享到了微博上,24h后,微博阅读量达到1万,她收到了100元的广告费。年轻女白领收到广告费后非常的开心,因为她做着自己喜欢的事,还因此而获得了额外收益,从此决定创作出更多精美内容发送到微博上,与人分享自己的快乐。故事二:201X年,微博用户掀起“打拐”行动(打击拐卖儿童行动),一条“6岁女孩周XX四川彭州被拐”的微博在网上被疯狂转发,引来无数网友关心。不久之后,杭州一位女士,发现该条微博使用的照片正是自己女儿的照片,而自己的女儿一直在家中,并未被拐。于是立马报警,网警查看了微博的操作记录(全部存在区块链上),快速追溯到了虚假微博的始作俑者,并将其绳之于法。上述故事情节,在去中心化微博平台中都是可以实现的,借助于区块链技术,可以保证微博上的所有数据和行为可溯源,从而保证传播信息的真实性。同时,由于去除掉了中心化主体,微博的参与者将同时成为微博平台的所有者,可以共享微博平台的收益。一、现有的中心化微博平台——新浪微博传统微博(如新浪微博)就是一个中心化的应用平台,新浪公司就是整个微博平台的中心。新浪公司制定新浪微博的运行规则,开发出整个微博平台,为其提供中央服务器,维持着整个新浪微博的运转,并不断地向外推广,吸引用户使用。一切商业行为都是为了追逐利益的,新浪公司运营新浪微博,也是为了吸引广告主投放广告,从而获得巨额的广告收入。在中心化的微博平台中,大致流程是这样的,博主(发微博者)会编辑微博发送到新浪微博平台中,新浪微博微博推送给观众(看微博者),观众查看微博微博中会夹杂着一些广告,观众看微博时也会看到一些广告。广告主会为广告的浏览量和点击量,支付广告费给新浪公司。二、去中心化微博平台与传统微博平台不同,在去中心化微博平台中,将没有中心机构,没有中央服务器,主要是通过区块链技术,运用分布式自治组织(DAO)的组织架构,实现微博平台的自治。让每一个微博参与者都成为微博平台的所有者,他们将共享微博平台获得的全部收益。在去中心化微博平台中,参与者主要有:发微博者,他们是微博内容提供者,是最核心的参与者之一。微博平台受不受欢迎,很大程度上依赖于内容的质量,而这就必然取决于发微博者。发微博者可以根据其微博中所包含广告的浏览量(等同于微博浏览量)和点击量,来获得微币(WB)作为奖励。挖矿者(存储节点),提供算力和存储能力,充当着服务器的角色,是微博平台得以正常运行的基础。微博系统每隔10分钟会将最新微博打包发送到各个存储节点中,存储节点会储存最新的微博数据,保证所有数据可溯源(区块链技术特点)。作为奖励,系统会给提供算力和存储能力的挖矿者以微币(WB)作为奖励。看微博者,他们是微博内容的浏览者,是微博平台中的主要用户,根据其对微博以及广告的浏览量和点击量,系统也会给予其微币(WB)作为奖励;广告主,在微博中投放广告,以提高自己品牌知名度或者直接引流的商家,他们可以在微博中投放广告,并根据广告的浏览量和点击量,用微币(WB)来支付广告费。在四个参与者中,发微博者、挖矿者和看微博者在参与过程中,都会获取到微币(WB)作为奖励,而广告主则主要需要消耗微币(WB)才能参与到微博活动中。因此,会形成一个微币(WB)交易市场。在交易市场中,广告主用现实中的通用货币(如RMB)购买其他参与者手中的微币(WB)。此外,博主(发微博者)通过微博下方所包含的广告是可以获得收益的,但广告也会给粉丝(看微博者)带来阅读成本,甚至造成反感,从而取消关注,所以博主会主动去把握好广告与粉丝之间的均衡。因此,在去中心化微博平台中,会将微博中广告数量和内容的选择权让渡给博主,从而降低粉丝阅读广告的心理成本,并提高广告的点击量。如一个摄影博主,发了一个在极地拍摄美景的微博微博下方的广告则选择了与博主同款单反相机的广告,因为关注他微博的人都是以摄影爱好者为主,因此对这样的广告不会过度反感,甚至还会主动去了解。(注:笔者经常在某浪微博上刷到贷款、祛痘、整形等垃圾广告,表示十分反感,无法忍受!)去中心化微博平台参与者所构成的业务流程图详情如下: 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值