文章目录
- 起因
- 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: UNLICENSED pragma 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 time
from eth_abi.codec import ABICodec
from web3 import Web3, HTTPProvider, WebsocketProvider
from web3._utils.events import get_event_data
from web3.types import ABIEvent
import contract_abi
from web3.logs import STRICT, IGNORE, DISCARD, WARN
dmall_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 = None
count = 0
while 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 = None
count = 0
while 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 whatever
def 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 above
const provider = await getProvider()
const requestManager = new RequestManager(provider)
const factory = new ContractFactory(requestManager, abi)
const contract = (await factory.at(
"0xD1F7012D2b5E2B8aDB02C62F6899ce01EFFD043f"
)) as any
const address = await getUserAccount()
log(address)
// Perform a function from the contract
const res = await contract.clickAd(
"0x9a1d7Ad2C21Bb462DE2D5cdeD44ed72343AFc257",
0,
"0xd6Cd1Cc3E779b958eA24943EfAa2e8a8a3752863",
{
from: address,
}
)
// Log response
log(res)
openExternalURL("https://item.jd.com/10045659650093.html")
},
{
button: ActionButton.PRIMARY,
hoverText: locationString,
}
)
)