## 璺ㄥ悎绾﹁皟鐢�

璇昏€呭璞★細ChainMaker涓嶄粎鏀寔鍚岃櫄鎷熸満鍐呰法鍚堢害璋冪敤锛屼篃鏀寔涓嶅悓绫诲瀷铏氭嫙鏈洪棿鐨勮法鍚堢害璋冪敤銆備緥濡傦紝wasmer鍚堢害鏃㈠彲浠ヨ皟鐢╳asmer鍚堢害锛屼篃鍙互璋冪敤docker-go鍚堢害銆傛湰绔犺妭涓昏浠嬬粛鍦ㄥ悎绾﹀唴璋冪敤鍏朵粬鍚堢害鐨勬柟娉曪紝涓昏闈㈠悜鏈夎法鍚堢害璋冪敤闇€姹傜殑寮€鍙戣€呫€�

### solidity鍚堢害鍐呭垱寤哄悎绾�

ChainMaker evm铏氭嫙鏈烘敮鎸乻olidity鍚堢害闈欐€佸垱寤簊olidity鍚堢害锛宻olidity鍚堢害鍔ㄦ€佸垱寤簊olidity鍚堢害锛屼互鍙妔olidity鍚堢害鍔ㄦ€佸垱寤哄叾浠栫被鍨嬪悎绾︺€�

#### 闈欐€佸垱寤�

鎵€璋撻潤鎬佸垱寤猴紝鏄寚鍦ㄥ悎绾﹀垱寤轰箣鍓嶏紝鍒涘缓鑰呭悎绾﹀繀椤绘帉鎻¤鍒涘缓鍚堢害鐨勪唬鐮併€備簩鑰呭湪缂栬瘧涔嬪墠灏卞凡缁忚缁戝畾锛屽苟涓€鍚岀紪璇戠敓鎴愬彲閮ㄧ讲鐨勫瓧鑺傜爜锛屼笉鑳藉湪杩愯鏃舵敼鍙樿鍒涘缓鑰呫€�

**闈欐€佸垱寤虹ず渚�**

鍚堢害static_create.sol锛屽疄鐜板姛鑳斤細

1銆侀儴缃睠reator鍚堢害鍚庯紝鍙皟鐢–reator鍚堢害鐨刢reateSalted鏂规硶鍒涘缓Creature鍚堢害锛�

2銆佸垱寤烘椂锛屽彲閫氳繃name鍙傛暟锛屼负Creature鍚堢害鎸囧畾鍚堢害鍚嶃€傛敞锛氶儴缃插悎绾︽椂锛孋hainMaker浼氭牴鎹悎绾﹀悕璁$畻鍚堢害鍦板潃锛屽苟灏嗗湴鍧€杩斿洖缁欑敤鎴凤紝鍚堢害閮ㄧ讲瀹屾垚鍚庯紝鐢ㄦ埛鍗冲彲浣跨敤鍚堢害鍚嶈皟鐢ㄥ悎绾︼紝涔熷彲浣跨敤鍚堢害鍦板潃璋冪敤鍚堢害銆�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract D {
    uint public x;
    constructor(uint a) payable {
        x = a;
    }

    function get() public view returns(uint){
        return x;
    }
}

contract C {
    function createDSalted(uint arg, string calldata name) public {
    		//鑺辨嫭鍙峰唴鐨剆alt涓哄垱寤洪€夐」锛屼細琚敤浣滃悎绾﹀湴鍧€鐨勭敓鎴愬洜瀛愶紝salt涓簊olidity璇硶鍏抽敭瀛楋紝璧嬪€肩被鍨嬩负byte32鏁版嵁鐨勫€�
				//濡傛灉涓嶆寚瀹氫负salt閫夐」锛屽啓娉曚负锛� D d = new D(arg);
				//sha256鏄痵olidity鐨勫唴缃嚱鏁帮紝鐢ㄤ簬璁$畻SHA256鍝堝笇
        D d = new D{salt: sha256(bytes(name))}(arg);
        uint x = d.get();
    }
}


```

濡傜ず渚嬫墍绀猴紝鍒涘缓鑰呭悎绾︿笌琚垱寤鸿€呭悎绾︿綅浜庡悓涓€鏂囦欢鍐咃紙涔熷彲浠mport瀵煎叆锛夛紝涓€鍚岀紪璇戯紝鎵ц鍒涘缓鍔ㄤ綔鏃讹紝鏃犳硶鏇存敼琚垱寤哄悎绾︺€�

鍒涘缓鏃讹紝鍙寚瀹歴alt閫夐」锛宻alt浼氳鐢ㄤ綔鍚堢害鍦板潃鐨勭敓鎴愬洜瀛愶紝salt涓簊olidity璇硶鍏抽敭瀛楋紝璧嬪€肩被鍨嬩负byte32鏁版嵁鐨勫€笺€俥vm铏氭嫙鏈鸿绠楀悎绾﹀湴鍧€鏃讹紝浼氬皢salt娣诲姞杩涙潵浣滀负鐢熸垚鍥犲瓙涔嬩竴銆�

鍒涘缓鏃讹紝濡傛灉涓嶆寚瀹歴alt閫夐」锛屽垯evm铏氭嫙鏈虹敓鎴愬湴鍧€鏃讹紝鐢熸垚鍥犲瓙鍙寘鎷皟鐢ㄨ€呫€佸綋鍓嶄氦鏄撳瓧鑺傛祦锛屾棤salt銆�

#### 鍔ㄦ€佸垱寤�

鎵€璋撳姩鎬佸垱寤猴紝鏄寚鍒涘缓鑰呭悎绾︿笉闇€瑕佹彁鍓嶇煡閬撹鍒涘缓鍚堢害鐨勪唬鐮侊紝鍙渶瑕佸湪鍒涘缓鏃讹紝鍛婅瘔鍒涘缓鑰呰鍒涘缓鍚堢害缂栬瘧鍚庣殑瀛楄妭鐮佸嵆鍙紝鐩告瘮闈欐€佸垱寤猴紝鍔ㄦ€佸垱寤烘洿鍔犵伒娲汇€�

**鍔ㄦ€佸垱寤虹ず渚�**

鍚堢害dynamic_create.sol锛屽疄鐜板姛鑳斤細

1銆侀儴缃睩actory鍚堢害鍚庯紝鍙皟鐢‵actory鍚堢害鐨刢reate鏂规硶鍒涘缓浠绘剰鍚堢害锛�

2銆佸垱寤烘椂锛屽彲鎸囧畾鍚堢害铏氭嫙鏈虹被鍨嬪拰鍚堢害鍚嶏紝骞舵牴鎹彁渚涚殑鍚堢害瀛楄妭鐮佸垱寤哄悎绾︺€�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.0;

contract Factory {
    function create(uint rtType, string calldata name, bytes calldata code) public returns (address addr){
        assert(0 < rtType && rtType < 8);//ChainMaker鏀寔7绉嶈櫄鎷熸満

        bytes memory rt  = new bytes(32);
        bytes memory len = new bytes(32);
        assembly {
            mstore(add(rt, 32), rtType)
            mstore(add(len, 32), code.length)
        }

        //// embed code model
        //bytes memory bc = hex"6080604052348015600f57600080fd5b5060ab8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806360fe47b11460375780636d4ce63c146049575b600080fd5b60476042366004605e565b600055565b005b60005460405190815260200160405180910390f35b600060208284031215606e578081fd5b503591905056fea2646970667358221220947c4414a60a5da51290bff12a07c9881060d29f34c67bde81d55122fa3d8f5864736f6c63430008040033";
        //bytes memory extCode = bytes.concat(bc, rt, bytes(name), len);

        // args code model
        // 娉ㄦ剰锛屽鏋滃姩鎬佸垱寤猴紝蹇呴』鍦ㄥ悎绾﹀瓧鑺傜爜鍚庯紝鎸夐『搴忔坊鍔犺櫄鎷熸満绫诲瀷銆佸悎绾﹀悕鍜屽師濮嬪悎绾﹀瓧鑺傜爜闀垮害锛�
        // 浠庤€岀敓鎴愪竴涓柊鐨勬墿灞曞瓧鑺傜爜锛屽苟灏嗘墿灞曞瓧鑺傜爜浠f浛鍘熷悎绾﹀瓧鑺傜爜浼犲叆create2鎸囦护浣滀负鍙傛暟,
        // 涓旇櫄鎷熸満绫诲瀷鍜屽師濮嬪悎绾﹀瓧鑺傜爜闀垮害蹇呴』浣跨敤32瀛楄妭瀛樺偍锛屽洜涓哄湪evm涓婏紝涓€涓猧nt鏄�256浣嶇殑
        bytes memory extCode = bytes.concat(code, rt, bytes(name), len);
        
        //create2鎸囦护鍙傛暟1涓鸿浆璐﹂锛屽弬鏁�2涓哄悎绾﹀瓧鑺傜爜闀垮害锛屽弬鏁�3涓哄瓧鑺傜爜锛屽弬鏁�4涓簊alt
        assembly { addr := create2(0, add(extCode, 0x20), mload(extCode), 0) }
    }
}
```

濡傜ず渚嬫墍绀猴紝鍒涘缓鑰呭悎绾︿笉闇€瑕佷簨鍏堢煡閬撹鍒涘缓鍚堢害锛屽彧闇€瑕佸湪璋冪敤create鏂规硶鏃讹紝浠ュ弬鏁板皢琚垱寤哄悎绾﹀瓧鑺傜爜浼犲叆鍗冲彲銆傚洜涓烘槸鍔ㄦ€佸垱寤猴紝琚垱寤哄悎绾︿笉闇€瑕佸湪缂栬瘧鍓嶅啓鍏ュ悓涓€鏂囦欢锛屾墍浠ワ紝闈瀞olidity鍚堢害鍚屾牱杩涘叆浜嗚鍒涘缓鑰呯殑鍙€夎寖鍥淬€�

鍔ㄦ€佸垱寤烘椂锛屽鏋滈渶瑕佹寚瀹氳鍒涘缓鍚堢害鐨勫悎绾﹀悕锛屾垨鑰呭垱寤虹殑鏄叾浠栬櫄鎷熸満绫诲瀷鐨勫悎绾︼紝閮藉繀椤诲湪鍚堢害瀛楄妭鐮佸悗锛屾寜椤哄簭娣诲姞鍚堢害铏氭嫙鏈虹被鍨嬨€佸悎绾﹀悕鍜屽師濮嬪悎绾﹀瓧鑺傜爜闀垮害(涓嶆寜璇ラ『搴忓皢瀵艰嚧瑙f瀽澶辫触)锛屼粠鑰岀敓鎴愪竴涓柊鐨勬墿灞曞瓧鑺傜爜锛屽苟灏嗘墿灞曞瓧鑺傜爜浠f浛鍘熷悎绾﹀瓧鑺傜爜浼犲叆create2鎸囦护浣滀负鍙傛暟銆傛澶栵紝铏氭嫙鏈虹被鍨嬪拰鍘熷鍚堢害瀛楄妭鐮侀暱搴﹀繀椤讳娇鐢�32瀛楄妭瀛樺偍锛屽惁鍒欏皢瑙f瀽澶辫触锛屽洜涓篹vm铏氭嫙鏈虹殑瀛楅暱鏄�256浣嶇殑銆�

濡傛灉涓嶅垱寤哄叾浠栬櫄鎷熸満绫诲瀷鐨勫悎绾︼紝鎴栬€呭垱寤簊olidity鍚堢害鏃讹紝涓嶉渶瑕佹寚瀹氬悎绾﹀悕锛岄偅涔堟病蹇呰浣跨敤鎵╁睍瀛楄妭鐮侊紝鍙娇鐢ㄥ師濮嬪悎绾﹀瓧鑺傜爜鍗冲彲銆�

#### 寮傛瀯鍒涘缓

寮傛瀯鍒涘缓鏄寚锛宻olidity鍚堢害鍒涘缓鍏朵粬铏氭嫙鏈虹被鍨嬬殑鍚堢害銆傚紓鏋勫垱寤烘柟寮忓拰鍔ㄦ€佸垱寤虹浉鍚岋紝鍙渶瑕佷负璋冪敤鑰呭悎绾︽彁渚涜櫄鎷熸満绫诲瀷銆佽璋冨悎绾﹀悕鍜屽悎绾﹀瓧鑺傜爜鍗冲彲锛屾敞鎰忥紝杩欎笁涓弬鏁伴兘鏄繀涓嶅彲灏戠殑銆�

### solidity鍚堢害鍐呰皟鐢ㄥ悎绾�

ChainMaker evm铏氭嫙鏈烘敮鎸乻olidity鍚堢害鍔ㄦ€佽皟鐢╯olidity鍚堢害锛宻olidity鍚堢害鍔ㄦ€佽皟鐢╯olidity鍚堢害锛屼互鍙妔olidity鍚堢害鍔ㄦ€佽皟鐢ㄥ叾浠栫被鍨嬪悎绾︺€�

#### 闈欐€佽皟鐢�

闈欐€佽皟鐢紝鏄寚鍦ㄨ皟鐢ㄤ箣鍓嶏紝璋冪敤鑰呭繀椤荤煡閬撹璋冪敤鑰呭悎绾︾殑鎺ュ彛銆傚嵆锛屽繀椤诲皢琚皟鐢ㄨ€呯殑鎺ュ彛鍜岃皟鐢ㄨ€呭悎绾︿竴鍚岀紪璇戙€傚湪瀹為檯鎵ц浣匡紝璋冪敤鑰呬笉鑳借皟鐢ㄦ帴鍙d互澶栫殑鏂规硶銆�

**闈欐€佽皟鐢ㄧず渚�**

鍚堢害callee.sol涓鸿璋冪敤鑰呭悎绾︼紝瀹炵幇浜嗕竴涓畝鍗曠殑鍔犳硶鍔熻兘銆�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity > 0.5.21;

//琚皟鐢ㄨ€呭悎绾�
contract Callee {
    function Adder(uint256 x, uint256 y) public returns(uint256) {
        return x + y;
    }
}
```

鍚堢害caller.sol涓鸿皟鐢ㄨ€呭悎绾︼紝鍙互璋冪敤callee.sol鍚堢害鐨勬柟娉曘€�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.21;

//琚皟鐢ㄥ悎绾allee鐨勬帴鍙�
abstract contract ICallee {
		//Callee.Adder鐨勬柟娉曠鍚�
    function Adder(uint256 x, uint256 y) public virtual returns(uint256);
}

//璋冪敤鑰呭悎绾�
contract Caller {
    function crossCall(address addr, uint256 x, uint256 y) public returns(uint256) {
        ICallee callee = ICallee(addr); //灏嗚璋冪敤鍚堢害鐨勫湴鍧€杞寲涓篒Calle鎺ュ彛
        return callee.Adder(x, y);      //鏍规嵁鎺ュ彛鍜屾柟娉曠鍚嶈皟鐢�
    }
}
```

濡傜ず渚嬫墍绀猴紝璋冪敤鑰呭悎绾aller鎵€鍦ㄦ枃浠跺唴锛屽0鏄庝簡涓€涓璋冪敤鑰呭悎绾allee鐨勬帴鍙Callee锛屾帴鍙e唴鏈塁allee鍚堢害鐨勬柟娉曠鍚嶃€傝皟鐢ㄨ€呭悎绾﹁幏寰楄璋冪敤鍚堢害鐨勫湴鍧€鍚庯紝鍗冲彲鏍规嵁瀹炵幇澹版槑鐨勬帴鍙o紝璋冪敤璇ュ湴鍧€鐨勬柟娉曚簡銆傛敞鎰忥紝鍦ㄨ皟鐢ㄨ€呭悎绾﹁皟鐢ㄨ璋冪敤鑰呬箣鍓嶏紝蹇呴』纭繚琚皟鐢ㄨ€呭悎绾﹀凡缁忛儴缃插畬鎴愩€�

#### 鍔ㄦ€佽皟鐢�

鎵€璋撳姩鎬佽皟鐢紝鏄寚璋冪敤鑰呭悎绾︿笉闇€瑕佹彁鍓嶇煡閬撹璋冪敤鍚堢害鐨勬帴鍙o紝鍙渶瑕佸湪璋冪敤鏃讹紝鍛婅瘔璋冪敤鑰呰璋冨悎绾︾殑鏂规硶绛惧悕鍗冲彲銆傝皟鐢ㄨ€呭悎绾︿笉闇€瑕佷簨鍓嶇粦瀹氳璋冭€呯殑鎺ュ彛锛屽彲浠ュ湪璋冪敤鏃讹紝鎸囧畾浠绘剰琚皟鐢ㄥ悎绾﹀強鍏舵柟娉曪紝鏇村姞鐏垫椿銆�

**鍔ㄦ€佽皟鐢ㄧず渚�**

鍚堢害dynamic_call.sol銆傞儴缃睠aller鍚堢害鍚庯紝鍙互璋冪敤浠绘剰solidity鍚堢害鍙婂叾鏂规硶锛屼笉闄愬畾鎺ュ彛銆�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity >= 0.8.0;

contract Caller {
    string[10] x;
    string[8] params;

    function cross_call(address callee, string calldata method, string calldata key, int256 value) public {
			//娉ㄦ剰锛宮ethod蹇呴』涓烘柟娉曠鍚嶆牸寮�,涓旀柟娉曠鍚嶇殑鍙傛暟闂翠笉鑳芥湁绌烘牸锛屼緥濡�"save(string,int256)"
	    callee.call((abi.encodeWithSignature(method, key, value));
    }
}
```

濡傜ず渚嬫墍绀猴紝璋冪敤鑰呭悎绾aller鍙互璋冪敤浠绘剰鍚堢害鐨勪换鎰忔柟娉曪紝鍙渶瑕佸皢琚皟鐢ㄥ悎绾︾殑鍦板潃銆佹柟娉曠鍚嶅拰鍙傛暟浼犵粰璋冪敤鑰呭悎绾﹀嵆鍙€�

娉ㄦ剰锛岃璋冨悎绾︾殑鏂规硶蹇呴』鏄柟娉曠鍚嶆牱寮忥紝涓旀柟娉曠鍚嶇殑鍙傛暟闂翠笉鑳芥湁绌烘牸锛屽绀轰緥涓敞閲婃墍绀猴紝鍚﹀垯鏃犳硶缂栬瘧涓哄噯纭殑ABI绫诲瀷鐨刢alldata锛宔vm灏嗘棤娉曡瘑鍒€�

#### 寮傛瀯璋冪敤

寮傛瀯璋冪敤鏄寚锛宻olidity鍚堢害璋冪敤鍏朵粬铏氭嫙鏈虹被鍨嬬殑鍚堢害锛屾瘮濡倃asm銆乨ocker-go绛夛紝鍙鍦–hainMaker鏀寔鑼冨洿鍐咃紝閮藉彲浠ュ紓鏋勮皟鐢ㄣ€�

solidity鎵ц璺ㄥ悎绾﹁皟鐢ㄦ椂锛屼細灏嗗弬鏁扮紪鐮佷负ABI鏍煎紡鐨刢alldata銆備絾锛屽鍏朵粬铏氭嫙鏈哄悎绾︽潵璇达紝瀹冧滑鐨勫弬鏁板苟涓嶉渶瑕丄BI缂栫爜锛屼篃娌℃湁ABI鏂囦欢锛屾墍浠ユ棤娉曡В鏋愪粠璋冪敤鑰卻olidity鍚堢害閭i噷浼犻€掓潵鐨勫弬鏁般€傞拡瀵硅繖绉嶆儏鍐碉紝ChainMaker鍗曠嫭瀹炵幇浜嗕竴濂楀紓鏋勮皟鐢ㄩ€昏緫銆�

鈥�	1 浣滀负璋冪敤鑰呯殑solidity鍚堢害闇€瑕佸湪鍚堢害鍐呭0鏄庝竴涓猻tring鏁扮粍绫诲瀷鐨勭姸鎬佸彉閲忥紝鐢ㄥ仛寮傛瀯璋冪敤鐨�**鍙傛暟缂撳啿鍖�**锛�

鈥�	2 鍦ㄥ紓鏋勮皟鐢ㄤ箣鍓嶏紝闇€瑕佸皢甯︿紶閫掔殑鍙傛暟鎸夐『搴忓啓鍏ュ弬鏁扮紦鍐插尯锛�

鈥�	3 鍙傛暟缂撳啿鍖虹殑绗竴涓厓绱狅紙涓嬫爣涓�0锛夊繀椤绘槸**"CrossVMCall"**瀛楃涓诧紝鐢ㄤ簬璁〤hainMaker evm璇嗗埆杩欐槸璺ㄨ櫄鎷熸満鐨勫紓鏋勫悎绾﹁皟鐢紱

鈥�	4 鍙傛暟缂撳啿鍖虹殑绗簩涓厓绱犲繀椤绘槸寰呰皟鐢ㄧ殑鏂规硶鍚嶏紙姝ゆ柟娉曞悕涓嶉渶瑕佹柟娉曠鍚嶆牸寮忥級锛�

鈥�	5 浠庣涓変釜鍙傛暟寮€濮嬶紝姣忎袱涓厓绱犱竴缁勶紝鏍囪瘑涓€涓緟浼犻€掑弬鏁帮紝鍓嶄竴涓厓绱犱负鍙傛暟鐨勭被鍨嬫垨key锛堣琚皟鍚堢害鑰屽畾锛夛紝鍚庝竴涓厓绱犱负鍙傛暟鐨勫€笺€�

鍏充簬杩涗竴姝ョ悊瑙e紓鏋勮皟鐢ㄧ殑鍐呭锛屽彲浠ュ弬鑰冩帴涓嬫潵鐨勫紓鏋勮皟鐢ㄧず渚嬨€�

**寮傛瀯璋冪敤绀轰緥**

鍚堢害cross_vm_call.sol銆傞儴缃睠rossCall鍚堢害鍚庯紝鍙互閫氳繃cross_call鏂规硶璋冪敤鍏朵粬铏氭嫙鏈虹被鍨嬬殑鍚堢害銆傘€�

```solidity
// SPDX-License-Identifier: GPL-3.0

pragma solidity >= 0.8.0;

contract CrossCall {
    string[10] x;
    string[8] params;  //鍙傛暟缂撳啿鍖�

		//address绫诲瀷鐨勫弬鏁癱allee涓鸿璋冪敤鍚堢害鍦板潃
    function cross_call(address callee, string calldata method, string calldata time, string calldata name, string calldata hash) public {
        
	//CrossVMCall is reserved key word
        params[0] = "CrossVMCall";//CrossVMCall涓哄浐瀹氬€硷紝绗竴涓弬鏁板繀椤绘槸姝ゅ€�
        params[1] = method;       //鏂规硶鍚嶏紝渚嬪"save"
        params[2] = "time";       //鍙傛暟1鐨勭被鍨嬫垨key
        params[3] = time;         //鍙傛暟1鐨剉alue
        params[4] = "file_name";  //鍙傛暟2鐨勭被鍨嬫垨key
        params[5] = name;         //鍙傛暟2鐨剉alue
        params[6] = "file_hash";  //鍙傛暟3鐨勭被鍨嬫垨key
        params[7] = hash;         //鍙傛暟2鐨剉alue

	      callee.call("");//璺ㄨ櫄鎷熸満璋冪敤callee鍚堢害锛宑allee.call鐨勫弬鏁颁负绌猴紝evm铏氭嫙鏈轰細浠庡弬鏁扮紦鍐插尯璇诲彇瀵瑰簲鐨勫弬鏁�
    }
}
```

濡傜ず渚嬫墍绀猴紝solidity璺ㄨ櫄鎷熸満寮傛瀯璋冪敤鏃讹紝蹇呴』鎻愪緵琚皟鍚堢害鐨勫湴鍧€锛岃€屼笉鑳芥槸鏂规硶鍚嶏紝鍥犱负鍚堢害璋冪敤鏂规硶call鏄痵olidity璇硶涓紝鍦板潃绫诲瀷鐨勬垚鍛樻柟娉曪紝浣跨敤鍚堢害鍚嶅垯鏃犳硶璇嗗埆銆�

### 鍏朵粬铏氭嫙鏈鸿法鍚堢害璋冪敤

鐩告瘮浜巗olidity锛孋hainMaker鐨勫叾浠栬櫄鎷熸満绫诲瀷鍚堢害锛岄兘涓嶆敮鎸佸悎绾﹀垱寤哄悎绾︼紝鍙敮鎸佸悎绾﹁皟鐢ㄥ悎绾︺€備絾鍚屾瀯寮傛瀯閮芥敮鎸侊紝涓旂浉姣攕olidity涔熸洿鍔犵畝鍗曪紝鍙渶瑕佽皟鐢ㄨ绫诲瀷鍚堢害鎵€鎻愪緵鐨勮法鍚堢害璋冪敤鎺ュ彛鍗冲彲銆�

**璋冪敤绀轰緥**

鍚堢害go_cross_call_evm.go 涓篻o璇█鍚堢害璺ㄨ櫄鎷熸満璋冪敤soldity鍚堢害绀轰緥銆�

```solidity
/*
SPDX-License-Identifier: Apache-2.0
*/

package main

//export init_contract
func initContract() {}

//export upgrade
func upgrade() {}

//export crossCallEvmContract
func crossCallEvmContract() {
	ctx := NewSimContext()

	// 鑾峰彇鍙傛暟
	name, _ := ctx.ArgString("name")
	method, _ := ctx.ArgString("method")
	
	//璋冪敤solidity鍚堢害鏃讹紝闇€瑕佷娇鐢ˋBI灏嗚璋冨悎绾︾殑鍙傛暟缂栫爜涓篶alldata
	calldata, _ := ctx.Arg("calldata")
	params := make(map[string][]byte, 1)
	params["data"] = calldata

	//鎵ц璺ㄨ櫄鎷熸満璋冪敤
	if result, resultCode := ctx.CallContract(name, method, params); resultCode != SUCCESS {
		// 杩斿洖缁撴灉
		ctx.ErrorResult("failed to cross call evm contract: " + name)
	} else {
		// 杩斿洖缁撴灉
		ctx.SuccessResultByte(result)
		// 璁板綍鏃ュ織
		ctx.Log("cross call evm contract result:" + string(result))
	}
}

func main() {

}
```

濡傜ず渚嬫墍绀猴紝go鍚堢害璋冪敤solidity鍚堢害鏃讹紝鍙渶瑕佽皟鐢╣o鍚堢害鍐呯疆鐨凷imContext.CallContract鎺ュ彛鍗冲彲銆傚浜庤璋冪敤鑰呭悎绾︽潵璇达紝浼犻€掑悎绾﹀悕鎴栧悎绾﹀湴鍧€鍧囧彲锛岃€屼笉蹇呭儚solidity鍚堢害閭f牱闄愬埗蹇呴』浣跨敤鍦板潃銆�

娉ㄦ剰锛岃法铏氭嫙鏈鸿皟鐢╯olidity鍚堢害鏃讹紝鍚屾牱闇€瑕佷娇鐢ˋBI灏嗚璋冨悎绾︾殑鍙傛暟缂栫爜涓篶alldata锛岃瑙乕浣跨敤Solidity杩涜鏅鸿兘鍚堢害寮€鍙慮(./浣跨敤Solidity杩涜鏅鸿兘鍚堢害寮€鍙�.md)鐨�**calldata鐢熸垚绀轰緥**銆�




<br><br>