## 璺ㄥ悎绾﹁皟鐢� 璇昏€呭璞★細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 Creature { uint public x; constructor(uint a) payable { x = a; } function get() public view returns(uint){ return x; } } //鍒涘缓鑰呭悎绾� contract Creator { function bytesCopy(bytes memory src, bytes memory dst, uint begin) internal pure returns (bytes memory){ uint len = src.length < 31 ? src.length : 31; for(uint i = 0; i < len; i++){ dst[begin + i] = src[i]; } return dst; } function createSalted(uint arg, string calldata name) public { bytes memory bytesname = bytes(name); bytes memory custom = new bytes(32); uint8 rtTypeEvm = 5; //evm鐨勮櫄鎷熸満绫诲瀷鏄�5锛屾墍浠ヨ鍊煎繀椤绘槸5 custom[0] = bytes1(rtTypeEvm); //铏氭嫙鏈虹被鍨嬪繀椤绘斁鍏ustom鐨勯瀛楄妭锛宑ustom灏嗚祴鍊肩粰鍒涘缓閫夐」salt custom = bytesCopy(bytesname, custom, 1); //灏嗗悎绾﹀悕鎷疯礉鍒板悗31瀛楄妭鍐� bytes32 n; assembly{ n := mload(add(custom, 32)) } //鑺辨嫭鍙峰唴鐨剆alt涓哄垱寤洪€夐」锛宻alt涓簊olidity璇硶鍏抽敭瀛楋紝璧嬪€肩被鍨嬩负byte32鏁版嵁鐨勫€� //濡傛灉涓嶆寚瀹氫负salt閫夐」锛屽啓娉曚负锛� Creature d = new Creature(arg) Creature d = new Creature{salt: n}(arg); } } ``` 濡傜ず渚嬫墍绀猴紝鍒涘缓鑰呭悎绾︿笌琚垱寤鸿€呭悎绾︿綅浜庡悓涓€鏂囦欢鍐咃紙涔熷彲浠mport瀵煎叆锛夛紝涓€鍚岀紪璇戯紝鎵ц鍒涘缓鍔ㄤ綔鏃讹紝鏃犳硶鏇存敼琚垱寤哄悎绾︺€� 鍒涘缓鏃讹紝鍙€氳繃salt閫夐」鎸囧畾琚垱寤哄悎绾﹀悕锛宻alt涓篵yte32绫诲瀷锛屼絾绗竴涓瓧鑺傚繀椤昏祴鍊间负evm铏氭嫙鏈虹被鍨嬬殑鏋氫妇鍊�5锛屽悗31瀛楄妭鎵嶇敤浜庤祴鍊煎悎绾﹀悕锛屾墍浠ュ悎绾﹀悕闀垮害涓嶅緱瓒呰繃31瀛楄妭銆俥vm铏氭嫙鏈轰細鏍规嵁鍚堢害鍚嶈绠楀湴鍧€锛屽浜嶤hainmaker鏉ヨ锛屾墍鏈夌被鍨嬬殑鍚堢害锛岄兘鍚屾椂鏀寔閫氳繃鍚堢害鍚嶅拰鍚堢害鍦板潃涓ょ鏂瑰紡璋冪敤銆� 鍒涘缓鏃讹紝濡傛灉涓嶆寚瀹歴alt閫夐」锛屽垯evm铏氭嫙鏈哄皢涓鸿鍒涘缓鑰呭悎绾﹁嚜鍔ㄧ敓鎴愬悎绾﹀悕鍜屽悎绾﹀湴鍧€銆� #### 鍔ㄦ€佸垱寤� 鎵€璋撳姩鎬佸垱寤猴紝鏄寚鍒涘缓鑰呭悎绾︿笉闇€瑕佹彁鍓嶇煡閬撹鍒涘缓鍚堢害鐨勪唬鐮侊紝鍙渶瑕佸湪鍒涘缓鏃讹紝鍛婅瘔鍒涘缓鑰呰鍒涘缓鍚堢害缂栬瘧鍚庣殑瀛楄妭鐮佸嵆鍙紝鐩告瘮闈欐€佸垱寤猴紝鍔ㄦ€佸垱寤烘洿鍔犵伒娲汇€� **鍔ㄦ€佸垱寤虹ず渚�** 鍚堢害dynamic_create.sol锛屽疄鐜板姛鑳斤細 1銆侀儴缃睩actory鍚堢害鍚庯紝鍙皟鐢‵actory鍚堢害鐨刢reate鏂规硶鍒涘缓浠绘剰鍚堢害锛� 2銆佸垱寤烘椂锛屽彲鎸囧畾鍚堢害铏氭嫙鏈虹被鍨嬪拰鍚堢害鍚嶏紝骞舵牴鎹彁渚涚殑鍚堢害瀛楄妭鐮佸垱寤哄悎绾︺€� ```solidity // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; contract Factory { function bytesCopy(bytes memory src, bytes memory dst, uint begin) internal pure returns (bytes memory){ uint len = src.length < 31 ? src.length : 31; for(uint i = 0; i < len; i++){ dst[begin + i] = src[i]; } return dst; } function create(uint8 rtType, string calldata name, bytes calldata code) public returns (address addr){ assert(0 < rtType && rtType < 8);//ChainMaker鏀寔7绉嶈櫄鎷熸満 bytes memory bytesname = bytes(name); bytes memory bytesCode = code; bytes memory custom = new bytes(32); custom[0] = bytes1(rtType); custom = bytesCopy(bytesname, custom, 1); assembly { //create2鎸囦护鍙傛暟1涓鸿浆璐﹂锛屽弬鏁�2涓哄悎绾﹀瓧鑺傜爜闀垮害锛屽弬鏁�3涓哄瓧鑺傜爜锛屽弬鏁�4涓鸿櫄鎷熸満绫诲瀷+鍚堢害鍚� addr := create2(0, add(bytesCode,0x20), mload(bytesCode), mload(add(custom, 32))) } } } ``` 濡傜ず渚嬫墍绀猴紝鍒涘缓鑰呭悎绾︿笉闇€瑕佷簨鍏堢煡閬撹鍒涘缓鍚堢害锛屽彧闇€瑕佸湪璋冪敤create鏂规硶鏃讹紝浠ュ弬鏁板皢琚垱寤哄悎绾﹀瓧鑺傜爜浼犲叆鍗冲彲銆傚洜涓烘槸鍔ㄦ€佸垱寤猴紝琚垱寤哄悎绾︿笉闇€瑕佸湪缂栬瘧鍓嶅啓鍏ュ悓涓€鏂囦欢锛屾墍浠ワ紝闈瀞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>