浠ュお鍧婃櫤鑳藉悎绾︾増鏈€庢牱鍘诲崌绾?/a>

纭繚鏅鸿兘鍚堢害鏄彲鍗囩骇鐨勶紝骞朵粩缁嗚€冭檻鍙崌绾ц繃绋嬶紝杩欎袱鐐归兘寰堥噸瑕併€?/p>

鏈枃涓昏璇存槑浠ュお鍧婄殑娉ㄥ唽琛ㄥ悎绾︺€佷唬鐞嗗悎绾︺€佺户鎵跨殑瀛樺偍鍙崌绾ф€э紝浠ュ強鏇村鐨勫彲鍗囩骇鎬ф柟娉曘€?span style="display:none">d43鏄惧崱涔嬪

鍦ㄨ蒋浠跺伐绋嬩腑锛屽綋鍙戠幇鏂扮殑bug鍜屽畨鍏ㄩ闄╂椂锛岄€氬父浼氬瀹冧滑杩涜淇ˉ锛屽苟瀹炴椂鎺ㄩ€佹洿鏂扮殑鐗堟湰銆傚湪鏅鸿兘鍚堢害寮€鍙戜腑锛屽彲鍗囩骇鎬у苟涓嶆槸閭d箞绠€鍗曘€傚洜姝わ紝鎴戜滑蹇呴』閲囧彇涓嶅悓鐨勫仛娉曘€?span style="display:none">d43鏄惧崱涔嬪

浠ュお鍧婁粛澶勪簬璧锋闃舵锛屽叧浜庡浣曞崌绾ф櫤鑳藉悎绾︾増鏈殑浜夎寰堝锛屼絾鎴戜滑灏嗕粙缁嶄竴浜涘綋浠婃渶濂界殑閫夋嫨銆?span style="display:none">d43鏄惧崱涔嬪

娉ㄦ剰锛氭櫤鑳藉悎绾︾増鏈殑鍙崌绾ф€т粛鐒舵槸鐮旂┒鐨勬椿璺冮鍩熴€備互涓嬩换浣曚竴绉嶆柟娉曢兘鍙兘鐢变簬婊ョ敤鎴栨柊鍙戠幇鐨勬紡娲炶€屽鑷存櫤鑳藉悎绾﹀け璐ャ€?span style="display:none">d43鏄惧崱涔嬪

鏅鸿兘鍚堢害鍙崌绾ф€х殑鍩烘湰鏂规硶d43鏄惧崱涔嬪

鍦ㄨ繖閲岋紝鎴戜滑灏嗕粙缁嶄竴浜涙洿骞虫槗杩戜汉浣嗕笉澶€傚悎鐨勬櫤鑳藉悎绾﹀彲鍗囩骇鎬цВ鍐虫柟妗堛€傚敖绠¤繖浜涗笉鏄渶浣虫柟娉曪紝浣嗗畠浠槸褰撲粖浣跨敤鐨勬牳蹇冦€?span style="display:none">d43鏄惧崱涔嬪

娉ㄥ唽鍚堢害d43鏄惧崱涔嬪

娉ㄥ唽琛ㄥ悎绾﹀彲鑳芥槸鏈€绠€鍗曠殑鍙崌绾ф€ф柟娉曪紝浣嗘槸鍦ㄨ繖绉嶆柟娉曪紝绠€鍗曟€у甫鏉ヤ簡涓€浜涗弗閲嶇殑缂洪櫡銆?span style="display:none">d43鏄惧崱涔嬪

瀹冧娇鐢ㄤ袱涓櫤鑳藉悎绾︾殑宸ヤ綔锛氭敞鍐岃〃鍚堢害鍜岄€昏緫鍚堢害銆傛敞鍐岃〃鍗忓畾浠呯敤浜庡皢鐢ㄦ埛鎸囧悜閫昏緫鍗忓畾鐨勫綋鍓嶇増鏈€傛瘡褰撻€昏緫鍚堢害琚崌绾ф椂锛屾敞鍐岃〃鍚堢害鐨勬墍鏈夎€呭氨鍙互鏇存柊閫昏緫鍚堢害琚崌绾х殑鍦板潃銆?span style="display:none">d43鏄惧崱涔嬪

contract SomeRegister {d43鏄惧崱涔嬪

address backendContract;d43鏄惧崱涔嬪

address锛伙冀 previousBackends;d43鏄惧崱涔嬪

address owner;d43鏄惧崱涔嬪

function SomeRegister锛堬級 {d43鏄惧崱涔嬪

owner = msg.sender;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

modifier onlyOwner锛堬級 {d43鏄惧崱涔嬪

require锛坢sg.sender == owner锛?span style="display:none">d43鏄惧崱涔嬪

_;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

function changeBackend锛坅ddress newBackend锛?publicd43鏄惧崱涔嬪

onlyOwner锛堬級d43鏄惧崱涔嬪

returns 锛坆ool锛?span style="display:none">d43鏄惧崱涔嬪

{d43鏄惧崱涔嬪

if锛坣ewBackend 锛? backendContract锛?{d43鏄惧崱涔嬪

previousBackends.push锛坆ackendContract锛?d43鏄惧崱涔嬪

backendContract = newBackend;d43鏄惧崱涔嬪

return true;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

return false;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

杩欑鏂规硶鏄潪甯镐笉鍒╃殑锛屽洜涓哄綋鐢ㄦ埛鎯宠浣跨敤鍚堢害鏃讹紝浠栦滑蹇呴』棣栧厛鏌ユ壘褰撳墠鍦板潃銆傚惁鍒欏彲鑳藉鑷磋祫閲戞崯澶便€傚皢鏁版嵁杩佺Щ鍒版柊鍚堢害涓篃闈炲父鍥伴毦锛屽洜姝ゅ繀椤讳粩缁嗚€冭檻姝よ繃绋嬩互閬垮厤澶辫触銆?span style="display:none">d43鏄惧崱涔嬪

浠g悊鍚堢害d43鏄惧崱涔嬪

浠g悊鍚堢害鐢ㄤ簬灏嗘暟鎹拰璋冪敤杞彂鍒伴€昏緫鍚堢害銆備娇鐢ㄤ唬鐞嗗悎绾︼紝鐢ㄦ埛鍙互濮嬬粓璋冪敤鐩稿悓鐨勫悎绾﹀湴鍧€锛屽苟涓斿皢鍏剁畝鍗曞湴杞彂鍒板綋鍓嶉€昏緫鍚堢害銆?span style="display:none">d43鏄惧崱涔嬪

浠ュお鍧婃櫤鑳藉悎绾︾増鏈€庢牱鍘诲崌绾? src=d43鏄惧崱涔嬪

杩欑鏂规硶閫氳繃浣跨敤DELEGATECALL鎿嶄綔鐮佹潵宸ヤ綔銆侱ELEGATECALL鏄疎VM鎻愪緵鐨勭敤浜庣▼搴忛泦鐨勬搷浣滅爜銆傚畠鐨勫伐浣滄柟寮忎笌鏅€氳皟鐢ㄧ被浼硷紝鍙槸鐩爣鍦板潃鐨勪唬鐮佹槸鍦ㄨ皟鐢ㄥ崗瀹氱殑涓婁笅鏂囦腑鎵ц鐨勩€傝繖鎰忓懗鐫€鍍?ldquo;msg.sender”鍜?ldquo;msg.value”杩欐牱鐨勫€煎皢琚繚鐣欍€傚疄闄呬笂锛孌ELEGATECALL鍏佽鐩爣鍗忓畾浠h〃琚皟鐢ㄦ柟杩涜璋冪敤銆?span style="display:none">d43鏄惧崱涔嬪

contract Relay {d43鏄惧崱涔嬪

address public currentVersion;d43鏄惧崱涔嬪

address public owner;d43鏄惧崱涔嬪

modifier onlyOwner锛堬級 {d43鏄惧崱涔嬪

require锛坢sg.sender == owner锛?d43鏄惧崱涔嬪

_;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

function Relay锛坅ddress initAddr锛?{d43鏄惧崱涔嬪

currentVersion = initAddr;d43鏄惧崱涔嬪

owner = msg.sender; // this owner may be another contract with multisig锛?not a single contract ownerd43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

function changeContract锛坅ddress newVersion锛?publicd43鏄惧崱涔嬪

onlyOwner锛堬級d43鏄惧崱涔嬪

{d43鏄惧崱涔嬪

currentVersion = newVersion;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

function锛堬級 {d43鏄惧崱涔嬪

require锛坈urrentVersion.delegatecall锛坢sg.data锛夛級;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

灏界杩欑鏂规硶閬垮厤浜嗕笌娉ㄥ唽琛ㄥ悎鍚屾湁鍏崇殑闂锛屼絾瀹冧篃鏈夊叾鑷韩鐨勯棶棰樸€?渚嬪濡傛灉绠$悊涓嶅綋锛屾暟鎹瓨鍌ㄥ緢瀹规槗澶辫触銆傚鏋滄柊鍚堢害鐨勫瓨鍌ㄥ竷灞€涓庝互鍓嶇殑鍚堢害涓嶅悓锛屽垯鏁版嵁鍙兘宸叉崯鍧忋€傛瀹炵幇杩橀槻姝㈡偍浠庡嚱鏁版帴鏀惰繑鍥炲€硷紝浠庤€岄檺鍒朵簡鍏剁敤渚嬨€?span style="display:none">d43鏄惧崱涔嬪

鍌ㄥ瓨鍚堢害d43鏄惧崱涔嬪

涓庝互鍓嶇殑鏂规硶涓€鏍凤紝姝ゆ柟娉曢渶瑕佹偍鐨勯€昏緫鍚堢害浠ュ強杈呭姪鍚堢害銆傚湪杩欑鎯呭喌涓嬶紝杈呭姪鍚堢害鏄案涔呭瓨鍌ㄥ悎绾︺€傝鎶€鏈€氳繃鍒嗙閫昏緫鍜屾暟鎹潵璧蜂綔鐢ㄣ€傞€昏緫鍚堢害鍙互闅忔椂鍗囩骇锛屽苟涓旂敱浜庢暟鎹瓨鍌ㄥ湪澶栭儴锛屽洜姝ゆ偍鐨勬暟鎹彈鍒颁繚鎶ゃ€?span style="display:none">d43鏄惧崱涔嬪

浠ュお鍧婃櫤鑳藉悎绾︾増鏈€庢牱鍘诲崌绾? src=d43鏄惧崱涔嬪

褰撶劧锛岃繖绉嶆柟娉曚篃瀛樺湪鏍规湰缂洪櫡銆傚鏋滃湪瀛樺偍鍚堢害涓彂鐜伴敊璇垨婕忔礊锛屽垯鍦ㄤ笉鐮村潖褰撳墠鏁版嵁瀛樺偍鐨勬儏鍐典笅鏃犳硶瀵瑰叾杩涜鍗囩骇銆?杩欑鏂规硶鐨勫彟涓€涓棶棰樻槸閫昏緫鍗忓畾闇€瑕佷娇鐢ㄩ澶栫殑姘斾綋鏉ヨ繘琛屽閮ㄨ皟鐢ㄤ互鏌ョ湅鎴栦慨鏀规暟鎹€?span style="display:none">d43鏄惧崱涔嬪

鏇村悎閫傜殑鍗囩骇鏂规硶d43鏄惧崱涔嬪

鐜板湪璁╂垜浠潵鐪嬬湅涓€浜涙洿澶嶆潅銆佹洿鍚堥€傜殑鏅鸿兘鍚堢害鍗囩骇鏂规硶銆?span style="display:none">d43鏄惧崱涔嬪

缁ф壙鐨勫瓨鍌ㄥ彲鍗囩骇鎬?span style="display:none">d43鏄惧崱涔嬪

杩欑鎶€鏈娇鐢ㄤ笁绉嶄笉鍚岀殑鍚堢害锛氫唬鐞嗗悎绾︽潵濮旀墭璋冪敤骞跺厖褰撴案涔呭瓨鍌紱閫昏緫鍚堢害灏嗗鐞嗘暟鎹紱杩樻湁瀛樺偍鍚堢害銆備唬鐞嗗悎绾﹀拰閫昏緫鍚堢害閮界户鎵胯嚜瀛樺偍鍚堢害锛屽洜姝ゅ畠浠殑瀛樺偍寮曠敤鏄榻愮殑銆?span style="display:none">d43鏄惧崱涔嬪

浠ュお鍧婃櫤鑳藉悎绾︾増鏈€庢牱鍘诲崌绾? src=d43鏄惧崱涔嬪

褰撻€昏緫鍚堢害鏇存柊鏃讹紝鎴戜滑鍙渶瑕佹洿鏀逛唬鐞嗗悎绾︽墍鎸囧悜鐨勪綅缃嵆鍙娇鐢ㄤ粎绠$悊鍛樺姛鑳姐€傜敱浜庝唬鐞嗗拰閫昏緫鍗忓畾鍏锋湁鐩稿悓鐨勫瓨鍌ㄦ寚閽堬紝鍥犳鏃犻渶杩涜澶栭儴璋冪敤鍗冲彲鏌ョ湅鍜屼慨鏀规暟鎹€?span style="display:none">d43鏄惧崱涔嬪

涓嶅垢鐨勬槸锛岃繖绉嶆柟娉曚篃鏈夊叾鑷韩鐨勯櫡闃便€傜敱浜庝唬鐞嗗悎绾﹀拰瀛樺偍鍚堢害閮芥槸姘告亽鐨勶紝鍥犳锛屽鏋滃湪浠讳綍涓€涓悎绾︿腑鍙戠幇閿欒鎴栨紡娲烇紝閮芥棤娉曚慨澶嶃€?鍥犳鍔″繀浠旂粏鑰冭檻鎮ㄧ殑浠g悊鍜屽瓨鍌ㄧ粨鏋勩€?span style="display:none">d43鏄惧崱涔嬪

闈炵粨鏋勫寲瀛樺偍鍙崌绾ф€?span style="display:none">d43鏄惧崱涔嬪

闈炵粨鏋勫寲瀛樺偍鍙兘鏄綋鍓嶆渶澶х殑鍙崌绾ф€ф柟娉曪紝瀹冧娇鎴戜滑鑳藉鍒╃敤瀛樺偍涓姸鎬佸彉閲忕殑甯冨眬銆傛鏂规硶浠呴渶瑕佷袱涓悎绾?浠g悊鍚堢害鍜屽疄鏂藉悎绾?瀹炴柦鍚堢害鍖呭惈鏁版嵁鍜屽瓨鍌ㄣ€?span style="display:none">d43鏄惧崱涔嬪

璇ユ妧鏈殑宸ヤ綔鍘熺悊鏄皢鍙崌绾ф€ф墍闇€鐨勬暟鎹繚瀛樺湪瀛樺偍涓殑鍥哄畾浣嶇疆锛屼互闃叉琚柊鏁版嵁瑕嗙洊銆傛垜浠彲浠ヤ娇鐢⊿LOAD鍜孲STORE鎿嶄綔鐮佽繘琛屾眹缂栥€傜敱浜庡瓨鍌ㄦ彃妲藉彧鏄粠0x0寮€濮嬮€掑锛屽洜姝ゆ垜浠娇鐢ㄥ緢楂樼殑瀛樺偍鎻掓Ы鏉ラ槻姝㈣鐩?鎴戜滑鍙互閫氳繃瀵瑰父閲忓彉閲忚繘琛屾暎鍒楁潵鐢熸垚瀛樺偍妲姐€?鐢变簬鎭掑畾鐘舵€佸彉閲忎笉浼氬崰鐢ㄥ瓨鍌ㄧ┖闂达紝鍥犳鎴戜滑涓嶅繀鎷呭績瀹冧細琚鐩栥€?span style="display:none">d43鏄惧崱涔嬪

bytes32 private constant implementationPosition =d43鏄惧崱涔嬪

keccak256锛?ldquo;org.zeppelinos.proxy.implementation”锛?d43鏄惧崱涔嬪

鐢变簬浠g悊涓嶅啀浠庡瓨鍌ㄥ悎绾︾户鎵胯€屾潵锛屽洜姝ゆ垜浠幇鍦ㄤ篃鍙互鏇存柊瀛樺偍锛屼粠鑰岄槻姝㈠瓨鍌ㄩ敊璇?婕忔礊鍙樻垚鐏鹃毦鎬х殑銆?浣嗘槸鍦ㄥ崌绾у疄鏂藉悎绾︽椂锛屾垜浠繀椤荤户鎵夸互鍓嶇殑鍚堢害銆傜敱浜庝笉闇€瑕佹洿鏀瑰疄鏂藉悎绾︼紝鍥犳璇ユ柟娉曠敋鑷冲彲浠ヤ笌鐜版湁鍚堢害涓€璧蜂娇鐢ㄣ€?span style="display:none">d43鏄惧崱涔嬪

浠ュお鍧婃櫤鑳藉悎绾︾増鏈€庢牱鍘诲崌绾? src=d43鏄惧崱涔嬪

灏界杩欏彲鑳芥槸褰撳墠鍙崌绾ф€ф渶濂界殑鏂规硶锛屼絾涔熸湁涓嶅皯鎵硅瘎銆備唬鐞嗘墍鏈夎€呮嫢鏈夊法澶х殑鏉冨姏锛屽苟涓旈渶瑕佷竴瀹氱▼搴︾殑淇′换銆傚浜庢洿澶嶆潅鐨勭郴缁燂紝杩欏彲鑳戒篃涓嶆槸鍚堥€傜殑瑙e喅鏂规銆?span style="display:none">d43鏄惧崱涔嬪

鍗囩骇渚濊禆浜庢瀯閫犲嚱鏁扮殑鍚堢害d43鏄惧崱涔嬪

褰撲娇鐢ㄤ緷璧栦簬鏋勯€犲嚱鏁扮殑鍚堢害鏉ヨ缃竴浜涘垵濮嬬姸鎬佹椂锛屼笌浠g悊宸ヤ綔骞朵笉澶畝鍗曘€傜敱浜庢瀯閫犲嚱鏁板彧杩愯涓€娆★紝鑰屼唬鐞嗕笉鐭ラ亾閫昏緫鍚堢害鏋勯€犲嚱鏁颁腑璁剧疆鐨勫€硷紝鍥犳鎴戜滑闇€瑕佷竴绉嶆柟娉曞湪浠g悊涓垵濮嬪寲鍏朵腑鐨勪竴浜涘€笺€?span style="display:none">d43鏄惧崱涔嬪

鍒涘缓閫昏緫鍚堢害鍚庯紝EVM浼氫涪寮冩瀯閫犲嚱鏁帮紝鍥犳鎴戜滑涓嶈兘绠€鍗曞湴閲嶇敤浠g爜銆傜浉鍙嶏紝鎴戜滑蹇呴』閲囧彇鐙壒鐨勬柟娉曟潵瑙e喅姝ら棶棰樸€?span style="display:none">d43鏄惧崱涔嬪

鍒濆鍖栧嚱鏁?span style="display:none">d43鏄惧崱涔嬪

涓€绉嶅彲鑳界殑鏇夸唬鏂规硶鏄湪甯歌鍑芥暟涓娇鐢ㄦ瀯閫犲嚱鏁颁唬鐮併€傛垜浠彧闇€纭繚杩欎釜鍑芥暟锛堟垜浠皢璋冪敤鍒濆鍖栧嚱鏁帮級鍙兘杩愯涓€娆°€?span style="display:none">d43鏄惧崱涔嬪

contract Initializable {d43鏄惧崱涔嬪

/**d43鏄惧崱涔嬪

* @dev Indicates that the contract has been initialized.d43鏄惧崱涔嬪

*/d43鏄惧崱涔嬪

bool private initialized;d43鏄惧崱涔嬪

/**d43鏄惧崱涔嬪

* @dev Indicates that the contract is in the process of being initialized.d43鏄惧崱涔嬪

*/d43鏄惧崱涔嬪

bool private initializing;d43鏄惧崱涔嬪

/**d43鏄惧崱涔嬪

* @dev Modifier to use in the initializer function of a contract.d43鏄惧崱涔嬪

*/d43鏄惧崱涔嬪

modifier initializer锛堬級 {d43鏄惧崱涔嬪

require锛坕nitializing || 锛乮nitialized锛?“Contract instance has already been initialized”锛?d43鏄惧崱涔嬪

bool wasInitializing = initializing;d43鏄惧崱涔嬪

initializing = true;d43鏄惧崱涔嬪

initialized = true;d43鏄惧崱涔嬪

_;d43鏄惧崱涔嬪

initializing = wasInitializing;d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

}d43鏄惧崱涔嬪

鍦ㄤ娇鐢ㄥ垵濮嬪€艰瀹氶」鍑芥暟鏃讹紝蹇呴』鎵撹捣鍗佷簩鍒嗙簿绁炪€傝€冭檻閫昏緫鍚堢害缁ф壙鐨勫熀鏈悎绾︿篃寰堥噸瑕併€傝繖閮ㄥ垎鐗瑰埆澶嶆潅锛屽洜涓篠olidity涔熸敮鎸佸閲嶇户鎵裤€?span style="display:none">d43鏄惧崱涔嬪

缁撹d43鏄惧崱涔嬪

纭繚鏅鸿兘鍚堢害鏄彲鍗囩骇鐨勶紝骞朵粩缁嗚€冭檻鍙崌绾ц繃绋嬶紝杩欎袱鐐归兘寰堥噸瑕併€傝櫧鐒惰繖骞朵笉鏄竴涓叧浜庢櫤鑳藉悎绾﹀彲鍗囩骇鎬х殑閫夐」鐨勮灏藉垪琛紝浣嗚繖搴旇鏄叧浜庤繖涓富棰樼殑閫傚綋鎸囧崡銆?span style="display:none">d43鏄惧崱涔嬪

璐d换缂栬緫锛歝td43鏄惧崱涔嬪

鐩稿叧鎺ㄨ崘