文章目录

  • 起因
  • DMall是什么
    • 商业模式
    • 技术实现
  • 背景
    • 虚拟世界里的资产运营
    • Decentraland(一个完整的元宇宙世界该有的样子)
  • DMall为什么是有效的数字化创新
  • 技术验证
    • 智能合约
    • Python调用智能合约示例
    • Decentraland的smart item示例关键代码

起因

站在今天,回头看传统企业数字化的起点,不管是大型国有企业,还是民间风云老板,都投入了极大的热情,遗憾的是,那个时候并没有人想明白这数字化到底该咋做。转眼6年,当有人模糊弄明白了这事儿的时候,企业们已都开始却步了。其实,数字化也就是件要做的事儿,做的方法也不会有啥特殊,两步即可:定清目标路径、理顺组织执行。目标包括且只能包括两个部分:建设和使用降本提效的工具、开拓和经营绑定科技的业务。组织一定是按照目标分为成本中心和业务实体两部分,其管理也一定要符合科技特征(可参见上篇文章)。这篇文章就是想举个例子说明啥是传统企业的,绑定科技的新业务。当然,对于不同的产业,新业务也不一样,这个例子仅适用于运营传统线下商业的企业。

DMall是什么

商业模式

第一步,DMall是元宇宙中的用户,购买商户投放的,土地所有者控制的建筑构件(墙、天花板、地面等)上显示的商品,的购物场景。用户、商户、土地所有者和达猫基于智能合约分配利益。
第二步,DMall是附加上元宇宙中的万达广场,即,既有分布式的购物场景,也有集中式的生活中心。增加的部分的商业模式与实体万达广场一致。
第三步,DMall会将元宇宙里的万达广场与实体万达广场融合,构建线上线下融合的生活中心。
第四步,DMall会将引领所有web2.0时代的应用进化到web3.0时代,改变数据生产和应用的模式。

技术实现

元宇宙的技术支撑包含两个方面:新前端技术(就是钱学森翻译的灵境)、去中心化的交易技术(就是基于区块链的智能合约,包括NFT、数字货币等)。DMall的核心是后者。

背景

虚拟世界里的资产运营

Decentraland(一个完整的元宇宙世界该有的样子)

Decentraland(分布式大陆)是一个基于以太坊区块链实现的,分布式虚拟现实平台。在Decentraland平台中,用户可以创建、体验、和变现他们的内容和应用。
Decentraland中的,可游逛的有限3D虚拟空间,被成为Land。Land是一种非同质数字化资产(NFT),它被一个以太坊智能合约维护。Land被分为Parcel,Parcel被用笛卡尔坐标系标识。这些Parcel被社区的成员们永久持有,可以用MANA(马那币)购买,MANA是Decentraland的加密数字货币。这给了用户全权控制他们创建的环境和应用的权力。这些环境和应用包括从任何静态3D场景到更可交互的应用或者游戏。
一些Parcel进一步被组织为主题社区或者District。靠将parcel组织成district,社区可以创造由共同兴趣和用途的共享空间。你可以在这个Github地址找到最初的District建议列表。组成Decentraland的内容被储存和部署通过一个分布式网络,同时,所有权和交易在以太坊区块链上被验证。

DMall为什么是有效的数字化创新

对于传统线下商业运营组织,DMall可以是其“绑定科技的业务”的选项之一:

  • 生意的本质高度一致,传统线下商业运营组织擅长在不同的城市轻资产的运营生意
  • 元宇宙是下一个流量入口,抢先者可以享受新一轮流量红利
  • 基于数字人民币实现智能合约,符合整体金融和科技导向
  • 在海外元宇宙平台,出海中国制造,与整体方向保持一致
  • 科技含量高
  • 坚决去中心化(本质是坚决拥护一个中心),阿里等大型互联网企业里的个人既得利益者不会接受跟进
  • 可进一步发展为生活中心,让个人(和国家)成为数据的主人,所有的企业都能用到数据(付费给个人)
  • 强大的生态:希壤,抖音,腾讯,omega,啫喱

技术验证

智能合约

//SPDX-License-Identifier: UNLICENSEDpragma solidity >=0.7.0 <0.9.0;// Merchant must call MANAToken to approve DMall to spend MANA for itself first.
// Once DMall fails to transfer MANA from merchant to others, its ads will be invalid.
interface MANAToken {function approve(address _sender, uint256 _value) external returns (bool);function transferFrom(address _from, address _to, uint256 _value) external returns (bool);
}contract DMall {enum AdState { Undefined, Created, Approved, Updated, Invalid } enum ClickState { Undefined, Clicked, Bought } struct Ad {uint m2L;uint m2O;uint m2C;AdState state;mapping(address => mapping(address => ClickState)) clicks;}MANAToken manaToken;mapping(address => mapping(uint => Ad)) public ads;address public op;constructor(address _manaToken) {op = msg.sender;manaToken = MANAToken(_manaToken);}event AdCrted(address merchant, uint adId, uint m2L, uint m2O, uint m2C);event AdUpted(address merchant, uint adId, uint oM2L, uint oM2O, uint oM2C, uint m2L, uint m2O, uint m2C);event AdAppred(address merchant, uint adId);event AdClicked(address merchant, uint adId, address landowner, address consumer);event AdInvalid(address merchant, uint adId);event AdBought(address merchant, uint adId, address landowner, address consumer);function uptAd(uint _adId, uint _m2L, uint _m2O, uint _m2C) public {Ad storage ad = ads[msg.sender][_adId];if (ad.state == AdState.Undefined) {ad.state = AdState.Created;ad.m2L = _m2L;ad.m2O = _m2O;ad.m2C = _m2C;emit AdCrted(msg.sender, _adId, _m2L, _m2O, _m2C);}else {ad.state = AdState.Updated;uint oM2L = ad.m2L;uint oM2O = ad.m2O;uint oM2C = ad.m2C;ad.m2L = _m2L;ad.m2O = _m2O;ad.m2C = _m2C;emit AdUpted(msg.sender, _adId, oM2L, oM2O, oM2C, _m2L, _m2O, _m2C);}}function apprAd(address _merchant, uint _adId) public {require(msg.sender == op, "Only DMall operator can approve the deployment of Ad");require(ads[_merchant][_adId].state != AdState.Undefined && ads[_merchant][_adId].state != AdState.Approved , "The ad of merchant with the ID does not exist or has been approved");ads[_merchant][_adId].state = AdState.Approved;emit AdAppred(_merchant, _adId);}function clickAd(address _merchant, uint _adId, address _landowner) public {require(ads[_merchant][_adId].state == AdState.Approved, "The ad of merchant with the ID has not been approved");require(ads[_merchant][_adId].clicks[_landowner][msg.sender] != ClickState.Clicked, "The clicking had been paid but does not lead to buying yet");if (manaToken.transferFrom(_merchant, _landowner, ads[_merchant][_adId].m2L) && manaToken.transferFrom(_merchant, op, ads[_merchant][_adId].m2O) ) {ads[_merchant][_adId].clicks[_landowner][msg.sender] = ClickState.Clicked;emit AdClicked(_merchant, _adId, _landowner, msg.sender);}else {ads[_merchant][_adId].state = AdState.Invalid;emit AdInvalid(_merchant, _adId);}}function buyAd(address _merchant, uint _adId, address _landowner) public {require(ads[_merchant][_adId].clicks[_landowner][msg.sender] == ClickState.Clicked, "The consumer does not click the ad or has bought");if (manaToken.transferFrom(_merchant, msg.sender, ads[_merchant][_adId].m2C)) {ads[_merchant][_adId].clicks[_landowner][msg.sender] = ClickState.Bought;emit AdBought(_merchant, _adId, _landowner, msg.sender);}else {ads[_merchant][_adId].state = AdState.Invalid;emit AdInvalid(_merchant, _adId);}        }
}

Python调用智能合约示例

import timefrom eth_abi.codec import ABICodec
from web3 import Web3, HTTPProvider, WebsocketProvider
from web3._utils.events import get_event_data
from web3.types import ABIEventimport contract_abi
from web3.logs import STRICT, IGNORE, DISCARD, WARNdmall_address = Web3.toChecksumAddress('0xD1F7012D2b5E2B8aDB02C62F6899ce01EFFD043f')
manatoken_address = Web3.toChecksumAddress('0x2a8fd99c19271f4f04b1b7b9c4f7cf264b626edb')merchant_private_key = ''
merchant_address = '0x9a1d7Ad2C21Bb462DE2D5cdeD44ed72343AFc257'landowner_private_key = ''
landowner_address = '0xd6Cd1Cc3E779b958eA24943EfAa2e8a8a3752863'consumer_private_key = ''
consumer_address = '0xc5E1d07D6653e7DC935ff3efC388a074Ee266FCB'# w3 = Web3(HTTPProvider('https://ropsten.infura.io/v3/dd4cc999659f448d905400a4e8fb4e9d'))
w3 = Web3(WebsocketProvider('wss://ropsten.infura.io/ws/v3/dd4cc999659f448d905400a4e8fb4e9d'))# w3.eth.enable_unaudited_features()dmall_contract = w3.eth.contract(address=dmall_address, abi=contract_abi.dmall_abi)
manatoken_contract = w3.eth.contract(address=manatoken_address, abi=contract_abi.manatoken_abi)def m_appr_dmall(dmall, amount):nonce = w3.eth.getTransactionCount(merchant_address)txn_dict = manatoken_contract.functions.approve(dmall, amount).buildTransaction({'chainId': 3,'gas': 140000,'gasPrice': w3.toWei('40', 'gwei'),'nonce': nonce,})signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=merchant_private_key)result = w3.eth.sendRawTransaction(signed_txn.rawTransaction)tx_receipt = Nonecount = 0while tx_receipt is None and (count < 30):time.sleep(10)try:tx_receipt = w3.eth.get_transaction_receipt(result)print(tx_receipt)except Exception as e:print('error: ', e)if tx_receipt is None:return {'status': 'failed', 'error': 'timeout'}processed_receipt = manatoken_contract.events.Approval().processReceipt(tx_receipt, errors=IGNORE)print(processed_receipt)# output = "Address {} approved address {} with the value {}" \#     .format(processed_receipt[0].args.owner, processed_receipt[0].args.spender, processed_receipt[0].args.value)# print(output)return {'status': 'added', 'processed_receipt': processed_receipt}def m_pub_ad(ad_id, m_2_l, m_2_o, m_2_c):nonce = w3.eth.getTransactionCount(merchant_address)txn_dict = dmall_contract.functions.uptAd(ad_id, m_2_l, m_2_o, m_2_c).buildTransaction({'chainId': 3,'gas': 140000,'gasPrice': w3.toWei('40', 'gwei'),'nonce': nonce,})signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=merchant_private_key)result = w3.eth.sendRawTransaction(signed_txn.rawTransaction)tx_receipt = Nonecount = 0while tx_receipt is None and (count < 30):time.sleep(10)try:tx_receipt = w3.eth.get_transaction_receipt(result)print(tx_receipt)except Exception as e:print('error: ', e)if tx_receipt is None:return {'status': 'failed', 'error': 'timeout'}processed_receipt = dmall_contract.events.AdCrted().processReceipt(tx_receipt)print(processed_receipt)# output = "Address {} approved address {} with the value {}" \#    .format(processed_receipt[0].args.owner, processed_receipt[0].args.spender, processed_receipt[0].args.value)# print(output)return {'status': 'added', 'processed_receipt': processed_receipt}def m_pub_ad_without_reciept(ad_id, m_2_l, m_2_o, m_2_c):nonce = w3.eth.getTransactionCount(merchant_address)txn_dict = dmall_contract.functions.uptAd(ad_id, m_2_l, m_2_o, m_2_c).buildTransaction({'chainId': 3,'gas': 140000,'gasPrice': w3.toWei('40', 'gwei'),'nonce': nonce,})signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=merchant_private_key)result = w3.eth.sendRawTransaction(signed_txn.rawTransaction)print(result)def handle_event(event):print(event)print(Web3.toJSON(event))receipt = w3.eth.waitForTransactionReceipt(event['transactionHash'])print(receipt)# evt = get_event_data(codec, ABIEvent(contract_abi.dmall_abi), event)# print(evt)# and whateverdef log_loop(event_filter, poll_interval):while True:for event in event_filter.get_new_entries():handle_event(event)time.sleep(poll_interval)if __name__ == "__main__":# event AdCrted(address merchant, uint adId, uint m2L, uint m2O, uint m2C);# event AdUpted(address merchant, uint adId, uint oM2L, uint oM2O, uint oM2C, uint m2L, uint m2O, uint m2C);# event AdAppred(address merchant, uint adId);# event AdClicked(address merchant, uint adId, address landowner, address consumer);# event AdInvalid(address merchant, uint adId);# event AdBought(address merchant, uint adId, address landowner, address consumer);#e_filter = dmall_contract.events.AdCrted.createFilter(fromBlock="latest", address='0x551ca7Ca4e41bC5F9dE5A527544Cb7a9fA533DF1')# e_filter = w3.eth.filter({'address': '0x551ca7Ca4e41bC5F9dE5A527544Cb7a9fA533DF1'})#m_pub_ad_without_reciept(4, 13, 14, 15)#log_loop(e_filter, 5)m_appr_dmall(dmall_address, 100)

Decentraland的smart item示例关键代码

    ent.addComponent(new OnPointerDown(async function () {// Setup steps explained in the section aboveconst provider = await getProvider()const requestManager = new RequestManager(provider)const factory = new ContractFactory(requestManager, abi)const contract = (await factory.at("0xD1F7012D2b5E2B8aDB02C62F6899ce01EFFD043f")) as anyconst address = await getUserAccount()log(address)// Perform a function from the contractconst res = await contract.clickAd("0x9a1d7Ad2C21Bb462DE2D5cdeD44ed72343AFc257",0,"0xd6Cd1Cc3E779b958eA24943EfAa2e8a8a3752863",{from: address,})// Log responselog(res)openExternalURL("https://item.jd.com/10045659650093.html")},{button: ActionButton.PRIMARY,hoverText: locationString,}))

元宇宙里的新零售(DMall)技术(前端+智能合约)验证相关推荐

  1. 百度要在“元宇宙”里办AI开发者大会了

    金磊 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI Facebook前脚改名Meta,All in元宇宙,百度也不想落后? 这不,百度决定在今年年底,把自家的Create AI开发者大会 ...

  2. 百度首次元宇宙里开大会,李彦宏:智能交通将使5年内一线城市不再限购限行...

    金磊 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 李彦宏手指按启动键,宇宙飞船便"嗖"的一下直插云霄.冲出大气层: 他还抽空在"中国空间站"内挥 ...

  3. 小说里的编程 【连载之十三】元宇宙里月亮弯弯

    第十三章 比特币区块链堵车 且说,班农和爱迪生被外星人放回来后,听说豆的列夫林也回来了,他们就去豆找了列夫林,三个人在一起,成天四处飘着. 估计是利用列夫林作掩护,在到处寻找大眼瞪驾驶的飞碟,尽管大眼 ...

  4. 小说里的编程 【连载之二十三】元宇宙里月亮弯弯

    第二十三章 亲亲兔子的小嘴 且说,飞碟被运回了外星人的基地里去了. 弗兰克一时也不知道怎么去找丢了的磁控管.在向地面申请的法律专家团队未到来之前,弗兰克再也不想主动地干点什么. 对于外界这种研究以外的 ...

  5. 布局元宇宙,探索新未来——WEB3.0·重庆站圆满落幕

    2023年3月25日,由CyberDao市场发展部主导的"WEB3.0·元宇宙峰会-重庆站"在重庆圆满落幕. 本次峰会以"布局元宇宙,探索新未来"为主题,围绕C ...

  6. 元宇宙里过圣诞!爆肝300小时打造「冬日仙境」,占地16万平米

    转自:新智元 2021年即将过去,2021年无疑堪称是元宇宙概念大爆发元年,那么圣诞节怎么能少了它呢?试想一下: 当甘道夫骑着影疾来到耸立在明多陆安山半山腰的「白城」. 这个守护着刚铎的众王之城所展现 ...

  7. 元宇宙里过圣诞,英伟达用300小时打造“冬日仙境”,占地16万平米

    新智元 在元宇宙里过圣诞是种什么体验?今天就带你体验一把!英伟达爆肝300小时打造的冬日仙境终于赶在节前发布了,总共耗费了超3000万个方块,占地近16万平米!三个大雪球构成的世界足够圣诞节去探索了, ...

  8. 英伟达、万向、风语筑、追梦者基金……大咖漫谈“元宇宙与产业新机遇”丨2022元宇宙云峰会...

    4 月 20 日上午,由巴比特主办的"万物起源・2022 元宇宙云峰会"正式开幕. 在上午场压轴圆桌<元宇宙与产业新机遇>中,巴比特CEO王雷与风语筑副总经理张树玉.英 ...

  9. 元宇宙游戏:新瓶换新酒

    当你打游戏时,你在打什么? 抛出这个问题,便也抛出了游戏背后的组成--设计.技术.应用. 在元宇宙产业链中最有感知度的,是场景和内容,作为现实世界的模拟与延伸,游戏和社交领域是最先具备实现基础的元宇宙 ...

最新文章

  1. 编程有多可怕 | 每日趣闻
  2. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...
  3. [Windows驱动开发](三)基础知识——驱动例程
  4. [机器学习]总结特征工程干货
  5. html超链接去虾线,挑虾线别只会用牙签了,渔民都是这样做的,1秒处理一个,超方便...
  6. 28 FI配置-财务会计-外币评估-检查分配到分类账组的会计核算原则
  7. 外媒:全球芯片短缺已影响洗衣机和烤面包机等小家电生产
  8. Math Type World2016安装
  9. Swift3 页面顶部实现拉伸效果代码
  10. vue 音频文件打包后找不到文件
  11. java简历模板 知乎,简历模板太多不知选哪种?让面试官眼前一亮的简历!
  12. 最新版24H全自动在线要饭系统全开源源码
  13. Canon打印机重复打印某一页的一半的故障
  14. 工具变量与两阶段最小二乘stata
  15. 两个stanby的NameNode问题解决
  16. php设计超级玛丽人物,面向对象实现简单版的超级马里奥小游戏
  17. pqi 更方便的使用pip源
  18. 人人都是产品经理总结 第五章
  19. 外星人Alienware 17R4基本上可完美黑苹果10.13.6
  20. 关于kernels启动报错的问题

热门文章

  1. 上班摸鱼神器:盯盘小工具 实时监视股票行情走势 电脑PC端
  2. 淘宝/Tmall获得淘宝分类详情API返回值说明
  3. 了解在Flash中的编程工作
  4. JPEG图像压缩探索_DCT变换的应用
  5. 系统工程(SE)学习笔记(一)——系统工程溯源
  6. 腾讯面试官:矩阵中的路径怎么求?
  7. 条形码设计软件BarTender实用教程——模板对象常见问题解答
  8. 诊断服务之0x10(DiagnosticSessionControl)
  9. mysql外键约束怎么写_mysql外键约束怎么写
  10. C++/OpenGL 入门(18):读取obj文件并贴图