资讯详情

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

文章目录

  • 起因
  • 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,
        }
      )
    )

标签: 电力电容电抗器限流电抗器xd1

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台