国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

solidity tx.origin和msg.sender那些事兒

這篇具有很好參考價(jià)值的文章主要介紹了solidity tx.origin和msg.sender那些事兒。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概述

????????tx.origin與msg.sender是solidity中容易令人迷惑的兩個(gè)變量,尤其是當(dāng)我們直接調(diào)用合約時(shí)兩者的值是相同的。為了更清晰的說明兩者的關(guān)系我們需要構(gòu)造合約間的鏈?zhǔn)秸{(diào)用,如下:

EOA -> Contract A -> Contract B -> Contract C

這里先說明結(jié)論:tx.origin始終保持是EOA,msg.sender是其直接調(diào)用者的地址。如:合約B中msg.sender的值為合約A的地址,合約C中msg.sender的值為合約B的地址。

????????簡(jiǎn)單來說,前者是原始的交易發(fā)起者的外部地址(EOA),后者是方法的直接調(diào)用者(可以是EOA也可以是合約地址)。以下我們通過簡(jiǎn)單的合約示例來觀察兩者值的變化。

抽絲剝繭

下面通過合約直接調(diào)用、合約間調(diào)用和合約間鏈?zhǔn)秸{(diào)用的形式由淺入深逐步揭開tx.origin和msg.sender的神秘面紗。

直接調(diào)用

此處我們直接通過外部賬戶(EOA)來調(diào)用合約。

代碼

contract AA {
    constructor() {
        console.log("Contract AA's address:", address(this));
    }

    fallback() external {
        console.log(
            "In AA fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }
}

上面代碼中在構(gòu)造函數(shù)中輸出了合約地址,在fallback函數(shù)中輸出了msg.sender和tx.origin的值。

執(zhí)行

操作過程如下:

1. 部署合約;

2. 執(zhí)行合約的fallback方法;

solidity tx.origin和msg.sender那些事兒,區(qū)塊鏈,區(qū)塊鏈,智能合約,開發(fā)語言,javascript,去中心化

由上面的執(zhí)行結(jié)果(箭頭1)我們可以看出,當(dāng)直接調(diào)用合約時(shí)msg.sender和tx.origin的值是相同的。

注:我們構(gòu)造了一個(gè)calldata參數(shù)來調(diào)用函數(shù)方法,該參數(shù)前4個(gè)字節(jié)標(biāo)示要調(diào)用的方法。其計(jì)算方法是先對(duì)方法簽名計(jì)算hash值(keccak256),然后截取hash的前四個(gè)字節(jié)(8個(gè)16進(jìn)制字符),最后補(bǔ)0至32個(gè)字節(jié)。此處我們調(diào)用合約中的fallback方法,因此隨機(jī)8個(gè)16進(jìn)制數(shù)即可。

合約間調(diào)用

此處我們通過合約間調(diào)用來觀察兩者的值。

代碼


contract AA {
    constructor() {
        console.log("Contract AA's address:", address(this));
    }

    fallback() external {
        console.log(
            "In AA fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }
    
    function remoteCall(address _instance) external {
        console.log(
            "In BB fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
        (bool sucess, ) = _instance.call(
            abi.encodeWithSignature("nonExistingFunction()")
        );
        require(sucess, "call error");
    }
}

contract BB {
    constructor() {
        console.log("Contract BB's address:", address(this));
    }

    fallback() external {
        console.log(
            "In BB fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }
}

以上代碼合約AA中的remoteCall方法接受一個(gè)合約地址(在執(zhí)行過程中我們輸入合約BB的地址),用于調(diào)用其它合約的方法,此處我們調(diào)用的是合約中不存在的一個(gè)方法,因此目標(biāo)合約的fallback方法會(huì)被觸發(fā)。

執(zhí)行

操作過程如下:

1. 部署合約AA;

2. 部署合約BB;

3. 以合約BB的地址為參數(shù)來調(diào)用合約AA的remoteCall方法;

solidity tx.origin和msg.sender那些事兒,區(qū)塊鏈,區(qū)塊鏈,智能合約,開發(fā)語言,javascript,去中心化

由上面執(zhí)行結(jié)果我們可能看出,當(dāng)合約AA調(diào)用合約BB中的方法時(shí),合約B中的msg.sender為合約AA的地址。

合約間鏈?zhǔn)秸{(diào)用

代碼

此處我們實(shí)現(xiàn)文章最開始描述的鏈?zhǔn)秸{(diào)用,即:

EOA -> Contract A -> Contract B -> Contract C


contract AA {
    constructor() {
        console.log("Contract AA's address:", address(this));
    }

    fallback() external {
        console.log(
            "In AA fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }
    

    function remoteCall(address _instance, address _instance2) external {
        console.log(
            "In AA fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );

        (bool sucess, ) = _instance.call(
            abi.encodeWithSignature("remoteCall(address)", _instance2)
        );
        require(sucess, "call error");
    }
}

contract BB {
    constructor() {
        console.log("Contract BB's address:", address(this));
    }

    fallback() external {
        console.log(
            "In BB fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }

    function remoteCall(address _instance) external {
        console.log(
            "In BB fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
        (bool sucess, ) = _instance.call(
            abi.encodeWithSignature("nonExistingFunction()")
        );
        require(sucess, "call error");
    }
}

contract CC {
    constructor() {
        console.log("Contract CC's address:", address(this));
    }

    fallback() external {
        console.log(
            "In CC fallback msg.sender:[%s] tx.origin:[%s] ",
            msg.sender,
            tx.origin
        );
    }
}

?上述代碼中合約AA通過remoteCall方法接收兩個(gè)地址,分別是合約BB、CC的地址,其中調(diào)用過程為:合約AA的remoteCall -> 合約BB的remoteCall -> 合約CC的fallback

執(zhí)行

操作過程如下:

1. 部署合約AA;

2. 部署合約BB;

3. 部署合約CC;

4. 調(diào)用合約AA的remoteCall方法,其參數(shù)分別為合約BB地址、合約CC地址;

solidity tx.origin和msg.sender那些事兒,區(qū)塊鏈,區(qū)塊鏈,智能合約,開發(fā)語言,javascript,去中心化

由上圖的執(zhí)行過程,我們可以驗(yàn)證文章開頭處的結(jié)論:tx.origin始終保持不變,其值是交易發(fā)起者的外部地址(EOA),msg.sender是其直接調(diào)用者的地址。文章來源地址http://www.zghlxwxcb.cn/news/detail-777861.html

到了這里,關(guān)于solidity tx.origin和msg.sender那些事兒的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • solidity call和delegatecall的那些事兒

    solidity call和delegatecall的那些事兒

    call 是solidity中合約之間交互的一個(gè)底層調(diào)用,但官方建議該方法僅在發(fā)送以太坊時(shí)使用,合約接受轉(zhuǎn)賬必須定義receive或payable fallback(當(dāng)調(diào)用合約中不存在的方法時(shí),該方法被默認(rèn)調(diào)用),而不建議用call來調(diào)用合約中存在的方法。關(guān)于receive和fallback的區(qū)別見下面示例合約Ca

    2024年02月03日
    瀏覽(18)
  • 邊緣計(jì)算那些事兒—邊緣智能技術(shù)

    邊緣計(jì)算那些事兒—邊緣智能技術(shù)

    ? ? ? ? 邊緣智能是邊緣計(jì)算中一個(gè)非常重要的方向。它將邊緣計(jì)算和人工智能算法結(jié)合起來,在邊緣設(shè)備上就近處理目標(biāo)檢測(cè)、物體跟蹤,識(shí)別等任務(wù)。這種處理方式可以降低時(shí)延,減少數(shù)據(jù)上送云端對(duì)回傳網(wǎng)絡(luò)的沖擊,同時(shí)保證數(shù)據(jù)的隱私和安全性。但是,我們要面對(duì)一

    2023年04月22日
    瀏覽(22)
  • tx H5_1.0.19算法 tx算法 encrypt_msg 騰訊encrypt_msg算法mobile_save接口中的msg值算法。

    tx H5_1.0.19算法 tx算法 encrypt_msg 騰訊encrypt_msg算法mobile_save接口中的msg值算法。

    tx充值QB頁(yè)面的mobile_save接口中的encrypt_msg值算法。 本帖學(xué)習(xí)研究探討 目標(biāo)網(wǎng)站地址 http://pay.qq.com/h5/ 版本 base_key_version=H5_1.0.21 encrypt_way=web_new_encrypt 目的是拿到最終的支付鏈接。 https://api.unipay.qq.com/v1/r/1450000490/mobile_save 可以看到 不管是QQ支付還是微信支付,最終的支付鏈接是

    2024年02月08日
    瀏覽(72)
  • 區(qū)塊鏈2——Solidity智能合約開發(fā)

    區(qū)塊鏈 索引目錄 智能合約是一種以代碼形式編寫的自動(dòng)執(zhí)行合約,它們運(yùn)行在區(qū)塊鏈上。這些合約定義了在特定條件下發(fā)生的事件以及相應(yīng)的行為。 1.1 智能合約結(jié)構(gòu) 版本聲明(Version Declaration): 智能合約通常以聲明版本開始,指定合約應(yīng)該使用的Solidity編譯器版本。例如

    2024年02月05日
    瀏覽(29)
  • 區(qū)塊鏈智能合約編程語言 Solidity

    上文介紹了區(qū)塊鏈生態(tài)發(fā)展,我們知道以太坊的到來可以使開發(fā)人員基于區(qū)塊鏈開發(fā)DApp,本文介紹 Solidity 編程語言的使用,然后基于 Solidity 編寫一個(gè)簡(jiǎn)單的智能合約。 Solidity 是以太坊開發(fā)人員使用的編程語言,用來編寫智能合約,運(yùn)行在以太坊虛擬機(jī)(EVM)上。 有開發(fā)經(jīng)

    2024年02月12日
    瀏覽(29)
  • solidity開發(fā) msg.value

    剛學(xué)完solidity的基礎(chǔ)開發(fā),想寫一個(gè)眾籌項(xiàng)目,在使用msg.value的時(shí)候,發(fā)現(xiàn)只要函數(shù)中使用到msg.value,就會(huì)自動(dòng)轉(zhuǎn)走賬戶的錢到該合約賬戶里。這讓我非常疑惑,那怎么轉(zhuǎn)出來呢?我寫了一個(gè)demo來測(cè)試。 測(cè)試結(jié)果是:當(dāng)我調(diào)用transfer()時(shí),會(huì)扣除sender的eth,轉(zhuǎn)到當(dāng)前合約賬戶

    2024年02月11日
    瀏覽(19)
  • 【區(qū)塊鏈實(shí)戰(zhàn)】Solidity 智能合約如何給賬戶充值

    【區(qū)塊鏈實(shí)戰(zhàn)】Solidity 智能合約如何給賬戶充值

    目錄 一、實(shí)戰(zhàn)場(chǎng)景 二、知識(shí)點(diǎn) 智能合約 智能合約函數(shù) 智能合約充值 payable 智能合約部署地址 智能合約的運(yùn)行 合約 this 對(duì)象 三、菜鳥實(shí)戰(zhàn) 四、運(yùn)行結(jié)果 Solidity 智能合約如何給賬戶充值 1、充值金額 2、充值并查看結(jié)果

    2024年02月09日
    瀏覽(23)
  • 【區(qū)塊鏈-智能合約工程師】第二篇:Solidity入門

    【區(qū)塊鏈-智能合約工程師】第二篇:Solidity入門

    參考文章:一文速覽2022十大智能合約開發(fā)工具 資料地址:WTF學(xué)院 HelloWorld remix:在線智能合約開發(fā)IDE(Integrated Development Environment,集成開發(fā)環(huán)境),可以在瀏覽器中快速部署測(cè)試智能合約。 合約HelloWorld: 事項(xiàng) 說明 代碼所用的軟件許可(license) 不寫許可的話編譯時(shí)會(huì)警告

    2024年02月09日
    瀏覽(28)
  • 區(qū)塊鏈智能合約solidity的中的一些關(guān)鍵字

    區(qū)塊鏈智能合約solidity的中的一些關(guān)鍵字

    目? 錄 pragma mapping msg對(duì)象 block對(duì)象 contract constructor struct 數(shù)據(jù)地址 地址類型 address payable revert 以下場(chǎng)景使用 revert() : require 以下場(chǎng)景使用 require() : assert 以下場(chǎng)景使用 assert(): 訪問權(quán)限 internal public private external function returns return view pure constant event emit modifier pragma ??

    2024年01月16日
    瀏覽(27)
  • 【區(qū)塊鏈-智能合約工程師】第三篇:Solidity進(jìn)階(一)

    學(xué)習(xí)資料地址:WTF學(xué)院 庫(kù)合約一般都是一些好用的函數(shù)合集(庫(kù)函數(shù)),為了提升solidity代碼的復(fù)用性和減少gas而存在。他和普通合約主要有以下幾點(diǎn)不同: 不能存在狀態(tài)變量 不能夠繼承或被繼承 不能接收以太幣 不可以被銷毀 String庫(kù) String庫(kù)合約是將uint256(大正整數(shù))類型

    2024年02月06日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包