您正在查看: Cross chain 分类下的文章

bsc-eth-swap 编译及部署测试

背景

项目后期需要准备一个ETH体系的资产IBC服务,设计要求轻量稳定安全。
前面对poly做过技术调研,相对去中心化,但导致运行和运维成本过高,以及近期出现的安全性问题,所以暂时搁置。
本片文章将针对BSC提供的Swap服务做技术调研,由于没有找到官方的部署文档,只有技术实现讲解,所以本篇文章将从合约代码,以及Swap程序代码阅读方向进行部署文档的反推整理。

合约实现包含了可升级合约的实现架构,相关技术细节可参考《使用OpenZeppelin编写可升级合约

本篇文章先做bsc-eth-swap项目的部署和测试整理,后面将针对服务做二次开发或者模式技术参考,目标是开发出一个ETH体系多链资产和NFT轻量的IBC服务,后期再迭代成多节点去中心化模式。

项目组成

项目合约:https://github.com/binance-chain/eth-bsc-swap-contracts.git
项目程序:https://github.com/binance-chain/bsc-eth-swap.git

官方文档

https://github.com/binance-chain/bsc-eth-swap/blob/main/docs/spec.md

编译合约

git clone https://github.com/binance-chain/eth-bsc-swap-contracts.git
cd eth-bsc-swap-contracts/
sudo npm i -g truffle
npm i
npm run truffle:compile

部署合约

为了方便测试,以及etherscan区块浏览器对于数据的展示较完整,所以我们选择的测试网络为

  • Goerli Test Network
  • Ropsten Test Network

ETH合约部署在Goerli(主),BSC合约部署在Ropsten(侧)

ETH链合约部署

部署网络

Goerli Test Network

部署ETHSwapAgentImpl合约

使用编译后的build\contracts\ETHSwapAgentImpl.json中的abibytecode部署合约。

ETHSwapAgentImpl ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20Addr","type":"address"},{"indexed":true,"internalType":"bytes32","name":"bscTxHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Addr","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"SwapPairRegister","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20Addr","type":"address"},{"indexed":true,"internalType":"address","name":"fromAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"SwapStarted","type":"event"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filledBSCTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"ownerAddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"registerSwapPairToBSC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bscTxHash","type":"bytes32"},{"internalType":"address","name":"erc20Addr","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fillBSC2ETHSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapETH2BSC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"}]
ETHSwapAgentImpl bytecode
0x608060405234801561001057600080fd5b506112d7806100206000396000f3fe60806040526004361061009c5760003560e01c806389b156041161006457806389b156041461017a5780638da5cb5b146101ad5780639867df11146101de578063b9927a9c14610227578063da35a26f14610253578063f2fde38b1461028c5761009c565b806334e19907146100a157806350877c77146100cd57806354cf2aeb1461010b5780635c13c15114610132578063715018a614610165575b600080fd5b3480156100ad57600080fd5b506100cb600480360360208110156100c457600080fd5b50356102bf565b005b3480156100d957600080fd5b506100f7600480360360208110156100f057600080fd5b503561031c565b604080519115158252519081900360200190f35b34801561011757600080fd5b50610120610331565b60408051918252519081900360200190f35b34801561013e57600080fd5b506100f76004803603602081101561015557600080fd5b50356001600160a01b0316610337565b34801561017157600080fd5b506100cb61081e565b34801561018657600080fd5b506100f76004803603602081101561019d57600080fd5b50356001600160a01b03166108c0565b3480156101b957600080fd5b506101c26108d5565b604080516001600160a01b039092168252519081900360200190f35b3480156101ea57600080fd5b506100f76004803603608081101561020157600080fd5b508035906001600160a01b036020820135811691604081013590911690606001356108e4565b6100f76004803603604081101561023d57600080fd5b506001600160a01b038135169060200135610a88565b34801561025f57600080fd5b506100cb6004803603604081101561027657600080fd5b50803590602001356001600160a01b0316610c94565b34801561029857600080fd5b506100cb600480360360208110156102af57600080fd5b50356001600160a01b0316610d58565b6102c7610e51565b6003546001600160a01b03908116911614610317576040805162461bcd60e51b81526020600482018190526024820152600080516020611258833981519152604482015290519081900360640190fd5b600455565b60026020526000908152604090205460ff1681565b60045481565b6001600160a01b03811660009081526001602052604081205460ff161561039a576040805162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b604482015290519081900360640190fd5b6060826001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156103d557600080fd5b505afa1580156103e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561041257600080fd5b810190808051604051939291908464010000000082111561043257600080fd5b90830190602082018581111561044757600080fd5b825164010000000081118282018810171561046157600080fd5b82525081516020918201929091019080838360005b8381101561048e578181015183820152602001610476565b50505050905090810190601f1680156104bb5780820380516001836020036101000a031916815260200191505b5060405250505090506060836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156104ff57600080fd5b505afa158015610513573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561053c57600080fd5b810190808051604051939291908464010000000082111561055c57600080fd5b90830190602082018581111561057157600080fd5b825164010000000081118282018810171561058b57600080fd5b82525081516020918201929091019080838360005b838110156105b85781810151838201526020016105a0565b50505050905090810190601f1680156105e55780820380516001836020036101000a031916815260200191505b5060405250505090506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561062957600080fd5b505afa15801561063d573d6000803e3d6000fd5b505050506040513d602081101561065357600080fd5b50518351909150610698576040805162461bcd60e51b815260206004820152600a602482015269656d707479206e616d6560b01b604482015290519081900360640190fd5b60008251116106dd576040805162461bcd60e51b815260206004820152600c60248201526b195b5c1d1e481cde5b589bdb60a21b604482015290519081900360640190fd5b6001600160a01b0385166000818152600160208181526040808420805460ff1916909317909255815160ff8616928101929092526060808352875190830152865133937ffe3bd005e346323fa452df8cafc28c55b99e3766ba8750571d139c6cf5bc08a0938993899389938392838101926080850192918901918190849084905b8381101561077657818101518382015260200161075e565b50505050905090810190601f1680156107a35780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156107d65781810151838201526020016107be565b50505050905090810190601f1680156108035780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a3506001949350505050565b610826610e51565b6003546001600160a01b03908116911614610876576040805162461bcd60e51b81526020600482018190526024820152600080516020611258833981519152604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b60016020526000908152604090205460ff1681565b6003546001600160a01b031681565b60006108ee610e51565b6003546001600160a01b0390811691161461093e576040805162461bcd60e51b81526020600482018190526024820152600080516020611258833981519152604482015290519081900360640190fd5b60008581526002602052604090205460ff161561099a576040805162461bcd60e51b81526020600482015260156024820152746273632074782066696c6c656420616c726561647960581b604482015290519081900360640190fd5b6001600160a01b03841660009081526001602052604090205460ff166109fe576040805162461bcd60e51b81526020600482015260146024820152733737ba103932b3b4b9ba32b932b2103a37b5b2b760611b604482015290519081900360640190fd5b6000858152600260205260409020805460ff19166001179055610a316001600160a01b038516848463ffffffff610e5516565b826001600160a01b031685856001600160a01b03167f3bebd9a738291e69898b5dbfadb6329b4b09fc648bdef68762928e521463abd9856040518082815260200191505060405180910390a4506001949350505050565b6000610a9333610ea7565b15610ae5576040805162461bcd60e51b815260206004820152601f60248201527f636f6e7472616374206973206e6f7420616c6c6f77656420746f207377617000604482015290519081900360640190fd5b333214610b39576040805162461bcd60e51b815260206004820152601c60248201527f6e6f2070726f787920636f6e747261637420697320616c6c6f77656400000000604482015290519081900360640190fd5b6001600160a01b03831660009081526001602052604090205460ff16610b9d576040805162461bcd60e51b81526020600482015260146024820152733737ba103932b3b4b9ba32b932b2103a37b5b2b760611b604482015290519081900360640190fd5b6004543414610be8576040805162461bcd60e51b81526020600482015260126024820152711cddd85c08199959481b9bdd08195c5d585b60721b604482015290519081900360640190fd5b610c036001600160a01b03841633308563ffffffff610ead16565b3415610c44576003546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610c42573d6000803e3d6000fd5b505b60408051838152346020820152815133926001600160a01b038716927ff60309f865a6aa297da5fac6188136a02e5acfdf6e8f6d35257a9f4e9653170f929081900390910190a350600192915050565b600054610100900460ff1680610cad5750610cad610f0d565b80610cbb575060005460ff16155b610cf65760405162461bcd60e51b815260040180806020018281038252602e81526020018061122a602e913960400191505060405180910390fd5b600054610100900460ff16158015610d21576000805460ff1961ff0019909116610100171660011790555b6004839055600380546001600160a01b0319166001600160a01b0384161790558015610d53576000805461ff00191690555b505050565b610d60610e51565b6003546001600160a01b03908116911614610db0576040805162461bcd60e51b81526020600482018190526024820152600080516020611258833981519152604482015290519081900360640190fd5b6001600160a01b038116610df55760405162461bcd60e51b81526004018080602001828103825260268152602001806111de6026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d53908490610f13565b3b151590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f07908590610f13565b50505050565b303b1590565b6060610f68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610fc49092919063ffffffff16565b805190915015610d5357808060200190516020811015610f8757600080fd5b5051610d535760405162461bcd60e51b815260040180806020018281038252602a815260200180611278602a913960400191505060405180910390fd5b6060610fd38484600085610fdd565b90505b9392505050565b60608247101561101e5760405162461bcd60e51b81526004018080602001828103825260268152602001806112046026913960400191505060405180910390fd5b61102785610ea7565b611078576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106110b75780518252601f199092019160209182019101611098565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611119576040519150601f19603f3d011682016040523d82523d6000602084013e61111e565b606091505b509150915061112e828286611139565b979650505050505050565b60608315611148575081610fd6565b8251156111585782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111a257818101518382015260200161118a565b50505050905090810190601f1680156111cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212207d800cfe9cc73238c171437c8cfab5dbce431b61738d8c89459b39acb1d5769064736f6c63430006040033

部署后的地址是0x4e99e2A70664f30d14b1f703b8bbe077872F5Fb7

部署ETHSwapAgentUpgradeableProxy合约

使用编译后的build\contracts\ETHSwapAgentUpgradeableProxy.json中的abibytecode部署合约。

ETHSwapAgentUpgradeableProxy abi
[{"inputs":[{"internalType":"address","name":"logic","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
ETHSwapAgentUpgradeableProxy bytecode
0x608060405234801561001057600080fd5b506040516109b33803806109b38339818101604052606081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b5060408181527f656970313936372e70726f78792e696d706c656d656e746174696f6e0000000082525190819003601c0190208693508592508491508390829060008051602061095d8339815191526000199091011461014357fe5b610155826001600160e01b0361027a16565b80511561020d576000826001600160a01b0316826040518082805190602001908083835b602083106101985780518252601f199092019160209182019101610179565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101f8576040519150601f19603f3d011682016040523d82523d6000602084013e6101fd565b606091505b505090508061020b57600080fd5b505b5050604080517f656970313936372e70726f78792e61646d696e000000000000000000000000008152905190819003601301902060008051602061093d8339815191526000199091011461025d57fe5b61026f826001600160e01b036102da16565b5050505050506102f2565b61028d816102ec60201b61054e1760201c565b6102c85760405162461bcd60e51b815260040180806020018281038252603681526020018061097d6036913960400191505060405180910390fd5b60008051602061095d83398151915255565b60008051602061093d83398151915255565b3b151590565b61063c806103016000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103b4565b6101a96101a4610414565b610439565b565b6101b361045d565b6001600160a01b0316336001600160a01b031614156101da576101d581610482565b6101e2565b6101e2610191565b50565b6101ed61045d565b6001600160a01b0316336001600160a01b031614156102855761020f83610482565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c61045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd610414565b90506102cc565b6102cc610191565b90565b6102d761045d565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b815260040180806020018281038252603a815260200180610555603a913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e61045d565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c2565b600061039361045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd61045d565b6103bc61045d565b6001600160a01b0316336001600160a01b0316141561040c5760405162461bcd60e51b81526004018080602001828103825260428152602001806105c56042913960600191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e808015610458573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b61048b816104e6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104ef8161054e565b61052a5760405162461bcd60e51b815260040180806020018281038252603681526020018061058f6036913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b3b15159056fe5472616e73706172656e745570677261646561626c6550726f78793a206e65772061646d696e20697320746865207a65726f20616464726573735570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e74726163745472616e73706172656e745570677261646561626c6550726f78793a2061646d696e2063616e6e6f742066616c6c6261636b20746f2070726f787920746172676574a2646970667358221220b76161e075f62521c54fef8e9af35ad8ae87258a9bd53744da1e6ed02b2aa47d64736f6c63430006040033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374
部署参数
  • _logic (逻辑合约,也就是上面部署的ETHSwapAgentImpl合约地址)0x4e99e2A70664f30d14b1f703b8bbe077872F5Fb7
  • Admin_ (升级管理权限地址,需要一个单独的地址,只用于升级合约,不能与当前部署ETHSwapAgentImpl合约的ownerAddr地址相同)0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
  • _data (ETHSwapAgentImpl合约中的initialize初始化bytes数据)
    ETHSwapAgentImpl中的initialize实现如下
    function initialize(uint256 fee, address payable ownerAddr) public initializer {
      swapFee = fee;
      owner = ownerAddr;
    }

    其中的ownerAddr为逻辑合约管理权限地址,切记不能与升级管理权限地址相同,否则无法执行。fee为跨链需要缴纳的手续费。
    简单说就是部署ETHSwapAgentUpgradeableProxy合约时,会把ETHSwapAgentImpl合约一同初始化{_logic.delegatecall(_data)},此时测试时预定的参数如下

    • fee = 100000000
    • ownerAddr = 0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa
      此时计算_data如下
      web3js.eth.abi.encodeFunctionCall({
      name: 'initialize',
      type: 'function',
      inputs: [{
        type: 'uint256',
        name: 'fee'
      },{
        type: 'address',
        name: 'ownerAddr'
      }]
      }, [100000000, '0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa']);

      得到

      0xda35a26f0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000bb93fcc2bb90d46255c43dd398a1a372e12be6aa

最终三个参数为

  • _logic0x4e99e2A70664f30d14b1f703b8bbe077872F5Fb7
  • Admin_0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
  • _data0xda35a26f0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000bb93fcc2bb90d46255c43dd398a1a372e12be6aa

部署后的地址是0x31366023017888A1ef48ca60cbB5de26aCBe6b02

测试ETHSwapAgentImpl合约

通过逻辑合约管理权限地址0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa使用ETHSwapAgentImpl ABI访问ETHSwapAgentUpgradeableProxy部署地址0x31366023017888A1ef48ca60cbB5de26aCBe6b02

  1. 查询swapFee等于100000000,然后使用setSwapFee修改值为100000000000000,再次查询确认值与修改值相同
  2. 使用registerSwapPairToBSC注册已发行ERC20代币,代币地址0x8ee79e91b1f7b882941f0c11bb91a760134bc644,并通过registeredERC20确认注册成功

测试ETHSwapAgentUpgradeableProxy合约

通过升级合约管理权限地址0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0使用ETHSwapAgentUpgradeableProxy ABI访问ETHSwapAgentUpgradeableProxy部署地址0x31366023017888A1ef48ca60cbB5de26aCBe6b02

  1. 使用changeAdmin修改当前升级合约管理权限地址0x10210572d6b4924Af7Ef946136295e9b209E1FA0,然后验证权限生效,再修改回0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
    一定确认好执行的权限地址是对应的,否则只报执行合约出错
  2. ETHSwapAgentImp合约中增加一个方法,
    function hellowWord() public view returns (string memory) {
     return "https://www.bcskill.com";
    }

    并重新编译和部署,新部署的地址为0x63F27AEE1A7C228D05f67C43F6C5ED82d726b104
    使用upgradeTo修改新逻辑合约地址NewImplementation0x63F27AEE1A7C228D05f67C43F6C5ED82d726b104
    然后通过逻辑合约管理权限地址,使用修改后ETHSwapAgentImpl合约编译得到的ABI,访问ETHSwapAgentUpgradeableProxy部署地址0x31366023017888A1ef48ca60cbB5de26aCBe6b02,执行hellowWord
    正确返回https://www.bcskill.com
    并再次验证测试ETHSwapAgentImpl合约中的流程,保证结果都正确

此时ETHSwapAgent合约相关部署已完成,

BSC侧链合约部署

对于BSCSwapAgent相关侧链部署同理,再此不做详细讲解,只做数据的记录

部署网络

Ropsten Test Network

1. BEP20Token合约部署

BEP20TokenImplementation ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"mintable","type":"bool"},{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

BEP20TokenImplementation bytecode

0x608060405234801561001057600080fd5b506114b2806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063a9059cbb11610071578063a9059cbb14610347578063b723b34e14610373578063dd62ed3e1461039f578063ef3ebcb8146103cd578063f2fde38b1461051957610121565b8063715018a6146102c8578063893d20e8146102d257806395d89b41146102f6578063a0712d68146102fe578063a457c2d71461031b57610121565b8063313ce567116100f4578063313ce56714610233578063395093511461025157806342966c681461027d5780634bf365df1461029a57806370a08231146102a257610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e61053f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b0381351690602001356105d6565b604080519115158252519081900360200190f35b6101eb6105f3565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b038135811691602081013590911690604001356105f9565b61023b610686565b6040805160ff9092168252519081900360200190f35b6101cf6004803603604081101561026757600080fd5b506001600160a01b03813516906020013561068f565b6101cf6004803603602081101561029357600080fd5b50356106e3565b6101cf6106fe565b6101eb600480360360208110156102b857600080fd5b50356001600160a01b031661070e565b6102d0610729565b005b6102da6107d6565b604080516001600160a01b039092168252519081900360200190f35b61012e6107ea565b6101cf6004803603602081101561031457600080fd5b503561084b565b6101cf6004803603604081101561033157600080fd5b506001600160a01b038135169060200135610919565b6101cf6004803603604081101561035d57600080fd5b506001600160a01b038135169060200135610987565b6101cf6004803603604081101561038957600080fd5b50803590602001356001600160a01b031661099b565b6101eb600480360360408110156103b557600080fd5b506001600160a01b0381358116916020013516610a62565b6102d0600480360360c08110156103e357600080fd5b8101906020810181356401000000008111156103fe57600080fd5b82018360208201111561041057600080fd5b8035906020019184600183028401116401000000008311171561043257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561048557600080fd5b82018360208201111561049757600080fd5b803590602001918460018302840111640100000000831117156104b957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff169250506020810135906040810135151590606001356001600160a01b0316610a8d565b6102d06004803603602081101561052f57600080fd5b50356001600160a01b0316610ba7565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105cb5780601f106105a0576101008083540402835291602001916105cb565b820191906000526020600020905b8154815290600101906020018083116105ae57829003601f168201915b505050505090505b90565b60006105ea6105e3610cb0565b8484610cb4565b50600192915050565b60035490565b6000610606848484610da0565b61067c84610612610cb0565b61067785604051806060016040528060288152602001611334602891396001600160a01b038a16600090815260026020526040812090610650610cb0565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610efe16565b610cb4565b5060019392505050565b60065460ff1690565b60006105ea61069c610cb0565b8461067785600260006106ad610cb0565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610f9516565b60006106f66106f0610cb0565b83610ff6565b506001919050565b600654600160a81b900460ff1690565b6001600160a01b031660009081526001602052604090205490565b610731610cb0565b60065461010090046001600160a01b03908116911614610786576040805162461bcd60e51b8152602060048201819052602482015260008051602061138a833981519152604482015290519081900360640190fd5b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031690565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105cb5780601f106105a0576101008083540402835291602001916105cb565b6000610855610cb0565b60065461010090046001600160a01b039081169116146108aa576040805162461bcd60e51b8152602060048201819052602482015260008051602061138a833981519152604482015290519081900360640190fd5b600654600160a81b900460ff16610908576040805162461bcd60e51b815260206004820152601a60248201527f7468697320746f6b656e206973206e6f74206d696e7461626c65000000000000604482015290519081900360640190fd5b6106f6610913610cb0565b836110f2565b60006105ea610926610cb0565b84610677856040518060600160405280602581526020016113f36025913960026000610950610cb0565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610efe16565b60006105ea610994610cb0565b8484610da0565b60006109a5610cb0565b60065461010090046001600160a01b039081169116146109fa576040805162461bcd60e51b8152602060048201819052602482015260008051602061138a833981519152604482015290519081900360640190fd5b600654600160a81b900460ff16610a58576040805162461bcd60e51b815260206004820152601a60248201527f7468697320746f6b656e206973206e6f74206d696e7461626c65000000000000604482015290519081900360640190fd5b6105ea82846110f2565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600054610100900460ff1680610aa65750610aa66111e4565b80610ab4575060005460ff16155b610aef5760405162461bcd60e51b815260040180806020018281038252602e81526020018061135c602e913960400191505060405180910390fd5b600054610100900460ff16158015610b1a576000805460ff1961ff0019909116610100171660011790555b60068054610100600160a81b0319166101006001600160a01b038516021790558651610b4d9060049060208a019061122c565b508551610b6190600590602089019061122c565b506006805460ff191660ff87161760ff60a81b1916600160a81b85151502179055610b8c82856110f2565b8015610b9e576000805461ff00191690555b50505050505050565b610baf610cb0565b60065461010090046001600160a01b03908116911614610c04576040805162461bcd60e51b8152602060048201819052602482015260008051602061138a833981519152604482015290519081900360640190fd5b6001600160a01b038116610c495760405162461bcd60e51b815260040180806020018281038252602681526020018061130e6026913960400191505060405180910390fd5b6006546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b6001600160a01b038316610cf95760405162461bcd60e51b81526004018080602001828103825260248152602001806112ea6024913960400191505060405180910390fd5b6001600160a01b038216610d3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061145b6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610de55760405162461bcd60e51b81526004018080602001828103825260258152602001806112c56025913960400191505060405180910390fd5b6001600160a01b038216610e2a5760405162461bcd60e51b81526004018080602001828103825260238152602001806113d06023913960400191505060405180910390fd5b610e6d816040518060600160405280602681526020016113aa602691396001600160a01b038616600090815260016020526040902054919063ffffffff610efe16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610ea2908263ffffffff610f9516565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610f8d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f52578181015183820152602001610f3a565b50505050905090810190601f168015610f7f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610fef576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661103b5760405162461bcd60e51b81526004018080602001828103825260218152602001806114186021913960400191505060405180910390fd5b61107e81604051806060016040528060228152602001611439602291396001600160a01b038516600090815260016020526040902054919063ffffffff610efe16565b6001600160a01b0383166000908152600160205260409020556003546110aa908263ffffffff6111ea16565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03821661114d576040805162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600354611160908263ffffffff610f9516565b6003556001600160a01b03821660009081526001602052604090205461118c908263ffffffff610f9516565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b303b1590565b6000610fef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610efe565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061126d57805160ff191683800117855561129a565b8280016001018555821561129a579182015b8281111561129a57825182559160200191906001019061127f565b506112a69291506112aa565b5090565b6105d391905b808211156112a657600081556001016112b056fe42455032303a207472616e736665722066726f6d20746865207a65726f206164647265737342455032303a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737342455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a207472616e7366657220746f20746865207a65726f206164647265737342455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e2066726f6d20746865207a65726f206164647265737342455032303a206275726e20616d6f756e7420657863656564732062616c616e636542455032303a20617070726f766520746f20746865207a65726f2061646472657373a2646970667358221220d28ad019253e134d8321300a2878b923db889aa49087e15f1ec77fc72393491a64736f6c63430006040033

部署地址:0x41941cC749d561A13A3a8295f355033D23fDc060

2. BSCSwapAgent合约部署

BSCSwapAgentImpl合约ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ethTxHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"ethRegisterTxHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Addr","type":"address"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"SwapPairCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Addr","type":"address"},{"indexed":true,"internalType":"address","name":"fromAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"SwapStarted","type":"event"},{"inputs":[],"name":"bep20Implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bep20ProxyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filledETHTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapMappingBSC2ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapMappingETH2BSC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bep20Impl","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"ownerAddr","type":"address"},{"internalType":"address","name":"bep20ProxyAdminAddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ethTxHash","type":"bytes32"},{"internalType":"address","name":"erc20Addr","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"createSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ethTxHash","type":"bytes32"},{"internalType":"address","name":"erc20Addr","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fillETH2BSCSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bep20Addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapBSC2ETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"}]
BSCSwapAgentImpl合约bytecode
0x608060405234801561001057600080fd5b50611db3806100206000396000f3fe608060405260043610620000f25760003560e01c806360b810f1116200008b5780638da5cb5b11620000615780638da5cb5b146200039b578063be0ace6914620003b3578063e307b93114620003ea578063f2fde38b146200043757620000f2565b806360b810f1146200033457806366fec65c146200036b578063715018a6146200038357620000f2565b806334e1990711620000cd57806334e19907146200025f578063358394d8146200028f5780634e2dc7f114620002dc57806354cf2aeb146200030a57620000f2565b80630344165a14620000f75780631ba3b150146200012b57806332bd6e31146200016e575b600080fd5b3480156200010457600080fd5b506200010f6200046e565b604080516001600160a01b039092168252519081900360200190f35b6200015a600480360360408110156200014357600080fd5b506001600160a01b0381351690602001356200047d565b604080519115158252519081900360200190f35b3480156200017b57600080fd5b506200010f600480360360a08110156200019457600080fd5b8135916001600160a01b0360208201351691810190606081016040820135640100000000811115620001c557600080fd5b820183602082011115620001d857600080fd5b80359060200191846001830284011164010000000083111715620001fb57600080fd5b9193909290916020810190356401000000008111156200021a57600080fd5b8201836020820111156200022d57600080fd5b803590602001918460018302840111640100000000831117156200025057600080fd5b91935091503560ff1662000717565b3480156200026c57600080fd5b506200028d600480360360208110156200028557600080fd5b503562000a24565b005b3480156200029c57600080fd5b506200028d60048036036080811015620002b557600080fd5b506001600160a01b0381358116916020810135916040820135811691606001351662000a85565b348015620002e957600080fd5b506200015a600480360360208110156200030257600080fd5b503562000b75565b3480156200031757600080fd5b506200032262000b8a565b60408051918252519081900360200190f35b3480156200034157600080fd5b506200010f600480360360208110156200035a57600080fd5b50356001600160a01b031662000b90565b3480156200037857600080fd5b506200010f62000bab565b3480156200039057600080fd5b506200028d62000bba565b348015620003a857600080fd5b506200010f62000c60565b348015620003c057600080fd5b506200010f60048036036020811015620003d957600080fd5b50356001600160a01b031662000c6f565b348015620003f757600080fd5b506200015a600480360360808110156200041057600080fd5b508035906001600160a01b0360208201358116916040810135909116906060013562000c8a565b3480156200044457600080fd5b506200028d600480360360208110156200045d57600080fd5b50356001600160a01b031662000e9f565b6005546001600160a01b031681565b60006200048a3362000f9e565b15620004dd576040805162461bcd60e51b815260206004820152601f60248201527f636f6e7472616374206973206e6f7420616c6c6f77656420746f207377617000604482015290519081900360640190fd5b33321462000532576040805162461bcd60e51b815260206004820152601c60248201527f6e6f2070726f787920636f6e747261637420697320616c6c6f77656400000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600260205260409020541680620005a0576040805162461bcd60e51b815260206004820152601b60248201527f6e6f2073776170207061697220666f72207468697320746f6b656e0000000000604482015290519081900360640190fd5b6007543414620005ec576040805162461bcd60e51b81526020600482015260126024820152711cddd85c08199959481b9bdd08195c5d585b60721b604482015290519081900360640190fd5b620006096001600160a01b03851633308663ffffffff62000fa416565b836001600160a01b03166342966c68846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156200065057600080fd5b505af115801562000665573d6000803e3d6000fd5b505050506040513d60208110156200067c57600080fd5b50503415620006c1576004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015620006bf573d6000803e3d6000fd5b505b60408051848152346020820152815133926001600160a01b0385811693908916927f49c08ff11118922c1e8298915531eff9ef6f8b39b44b3e9952b75d47e1d0cdd0929181900390910190a45060019392505050565b60006200072362001006565b6004546001600160a01b0390811691161462000775576040805162461bcd60e51b8152602060048201819052602482015260008051602062001d34833981519152604482015290519081900360640190fd5b6001600160a01b038781166000908152600160205260409020541615620007da576040805162461bcd60e51b8152602060048201526014602482015273323ab83634b1b0ba32b21039bbb0b8103830b4b960611b604482015290519081900360640190fd5b6006546005546040516000926001600160a01b03908116921690620007ff90620012f8565b6001600160a01b03928316815291166020820152606060408083018290526000918301829052519182900360a0019190f08015801562000843573d6000803e3d6000fd5b50604051631de7d79760e31b815260ff851660448201526000606482018190526001608483018190523060a4840181905260c06004850190815260c485018c905294955085946001600160a01b0386169463ef3ebcb8948e948e948e948e948e94939291908190602481019060e4018b8b80828437600083820152601f01601f191690910184810383528981526020019050898980828437600081840152601f19601f8201169050808301925050509a5050505050505050505050600060405180830381600087803b1580156200091957600080fd5b505af11580156200092e573d6000803e3d6000fd5b5050506001600160a01b03808b16600081815260016020908152604080832080549588166001600160a01b03199687168117909155808452600283529281902080549095168417909455835160ff8a1694810194909452606080855284018a9052919350918d917fcc0314763eabceb74cd3d30ae785c09bfe4e204af2088b3bfcdbbe5082133db5918b918b918f918f918d918190810160808201888880828437600083820152601f01601f191690910184810383528681526020019050868680828437600083820152604051601f909101601f1916909201829003995090975050505050505050a49998505050505050505050565b62000a2e62001006565b6004546001600160a01b0390811691161462000a80576040805162461bcd60e51b8152602060048201819052602482015260008051602062001d34833981519152604482015290519081900360640190fd5b600755565b600054610100900460ff168062000aa1575062000aa16200100a565b8062000ab0575060005460ff16155b62000aed5760405162461bcd60e51b815260040180806020018281038252602e81526020018062001d06602e913960400191505060405180910390fd5b600054610100900460ff1615801562000b19576000805460ff1961ff0019909116610100171660011790555b600680546001600160a01b038088166001600160a01b0319928316179092556007869055600480548684169083161790556005805492851692909116919091179055801562000b6e576000805461ff00191690555b5050505050565b60036020526000908152604090205460ff1681565b60075481565b6001602052600090815260409020546001600160a01b031681565b6006546001600160a01b031681565b62000bc462001006565b6004546001600160a01b0390811691161462000c16576040805162461bcd60e51b8152602060048201819052602482015260008051602062001d34833981519152604482015290519081900360640190fd5b6004546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600480546001600160a01b0319169055565b6004546001600160a01b031681565b6002602052600090815260409020546001600160a01b031681565b600062000c9662001006565b6004546001600160a01b0390811691161462000ce8576040805162461bcd60e51b8152602060048201819052602482015260008051602062001d34833981519152604482015290519081900360640190fd5b60008581526003602052604090205460ff161562000d45576040805162461bcd60e51b81526020600482015260156024820152746574682074782066696c6c656420616c726561647960581b604482015290519081900360640190fd5b6001600160a01b03808516600090815260016020526040902054168062000db3576040805162461bcd60e51b815260206004820152601b60248201527f6e6f2073776170207061697220666f72207468697320746f6b656e0000000000604482015290519081900360640190fd5b6000868152600360209081526040808320805460ff191660011790558051635b91d9a760e11b8152600481018790526001600160a01b03888116602483015291519185169363b723b34e9360448084019491939192918390030190829087803b15801562000e2057600080fd5b505af115801562000e35573d6000803e3d6000fd5b505050506040513d602081101562000e4c57600080fd5b50506040805184815290516001600160a01b03808716928992918516917f3bebd9a738291e69898b5dbfadb6329b4b09fc648bdef68762928e521463abd99181900360200190a450600195945050505050565b62000ea962001006565b6004546001600160a01b0390811691161462000efb576040805162461bcd60e51b8152602060048201819052602482015260008051602062001d34833981519152604482015290519081900360640190fd5b6001600160a01b03811662000f425760405162461bcd60e51b815260040180806020018281038252602681526020018062001cba6026913960400191505060405180910390fd5b6004546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b3b151590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526200100090859062001010565b50505050565b3390565b303b1590565b606062001067826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620010cc9092919063ffffffff16565b805190915015620010c7578080602001905160208110156200108857600080fd5b5051620010c75760405162461bcd60e51b815260040180806020018281038252602a81526020018062001d54602a913960400191505060405180910390fd5b505050565b6060620010dd8484600085620010e7565b90505b9392505050565b6060824710156200112a5760405162461bcd60e51b815260040180806020018281038252602681526020018062001ce06026913960400191505060405180910390fd5b620011358562000f9e565b62001187576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620011c85780518252601f199092019160209182019101620011a7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146200122c576040519150601f19603f3d011682016040523d82523d6000602084013e62001231565b606091505b5091509150620012438282866200124e565b979650505050505050565b606083156200125f575081620010e0565b825115620012705782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620012bc578181015183820152602001620012a2565b50505050905090810190601f168015620012ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6109b380620013078339019056fe608060405234801561001057600080fd5b506040516109b33803806109b38339818101604052606081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b5060408181527f656970313936372e70726f78792e696d706c656d656e746174696f6e0000000082525190819003601c0190208693508592508491508390829060008051602061095d8339815191526000199091011461014357fe5b610155826001600160e01b0361027a16565b80511561020d576000826001600160a01b0316826040518082805190602001908083835b602083106101985780518252601f199092019160209182019101610179565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101f8576040519150601f19603f3d011682016040523d82523d6000602084013e6101fd565b606091505b505090508061020b57600080fd5b505b5050604080517f656970313936372e70726f78792e61646d696e000000000000000000000000008152905190819003601301902060008051602061093d8339815191526000199091011461025d57fe5b61026f826001600160e01b036102da16565b5050505050506102f2565b61028d816102ec60201b61054e1760201c565b6102c85760405162461bcd60e51b815260040180806020018281038252603681526020018061097d6036913960400191505060405180910390fd5b60008051602061095d83398151915255565b60008051602061093d83398151915255565b3b151590565b61063c806103016000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103b4565b6101a96101a4610414565b610439565b565b6101b361045d565b6001600160a01b0316336001600160a01b031614156101da576101d581610482565b6101e2565b6101e2610191565b50565b6101ed61045d565b6001600160a01b0316336001600160a01b031614156102855761020f83610482565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c61045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd610414565b90506102cc565b6102cc610191565b90565b6102d761045d565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b815260040180806020018281038252603a815260200180610555603a913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e61045d565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c2565b600061039361045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd61045d565b6103bc61045d565b6001600160a01b0316336001600160a01b0316141561040c5760405162461bcd60e51b81526004018080602001828103825260428152602001806105c56042913960600191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e808015610458573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b61048b816104e6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104ef8161054e565b61052a5760405162461bcd60e51b815260040180806020018281038252603681526020018061058f6036913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b3b15159056fe5472616e73706172656e745570677261646561626c6550726f78793a206e65772061646d696e20697320746865207a65726f20616464726573735570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e74726163745472616e73706172656e745570677261646561626c6550726f78793a2061646d696e2063616e6e6f742066616c6c6261636b20746f2070726f787920746172676574a2646970667358221220d51b9a3c2a10700d22ce61992f1afda59614179c27719ea9d498bfc20e22c93d64736f6c63430006040033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c84fdff4cabd7d2277fe8f8ac5de02e6b150109b949e9a549407a80a0a4b3db664736f6c63430006040033

部署后地址:0xc5612639db6250a9e44A7d846fe60adCE1f65E53

BSCSwapAgentUpgradeableProxy 合约abi

[{"inputs":[{"internalType":"address","name":"logic","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

BSCSwapAgentUpgradeableProxy 合约bytecode

0x608060405234801561001057600080fd5b506040516109b33803806109b38339818101604052606081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b5060408181527f656970313936372e70726f78792e696d706c656d656e746174696f6e0000000082525190819003601c0190208693508592508491508390829060008051602061095d8339815191526000199091011461014357fe5b610155826001600160e01b0361027a16565b80511561020d576000826001600160a01b0316826040518082805190602001908083835b602083106101985780518252601f199092019160209182019101610179565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101f8576040519150601f19603f3d011682016040523d82523d6000602084013e6101fd565b606091505b505090508061020b57600080fd5b505b5050604080517f656970313936372e70726f78792e61646d696e000000000000000000000000008152905190819003601301902060008051602061093d8339815191526000199091011461025d57fe5b61026f826001600160e01b036102da16565b5050505050506102f2565b61028d816102ec60201b61054e1760201c565b6102c85760405162461bcd60e51b815260040180806020018281038252603681526020018061097d6036913960400191505060405180910390fd5b60008051602061095d83398151915255565b60008051602061093d83398151915255565b3b151590565b61063c806103016000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103b4565b6101a96101a4610414565b610439565b565b6101b361045d565b6001600160a01b0316336001600160a01b031614156101da576101d581610482565b6101e2565b6101e2610191565b50565b6101ed61045d565b6001600160a01b0316336001600160a01b031614156102855761020f83610482565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c61045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd610414565b90506102cc565b6102cc610191565b90565b6102d761045d565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b815260040180806020018281038252603a815260200180610555603a913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e61045d565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c2565b600061039361045d565b6001600160a01b0316336001600160a01b031614156102c4576102bd61045d565b6103bc61045d565b6001600160a01b0316336001600160a01b0316141561040c5760405162461bcd60e51b81526004018080602001828103825260428152602001806105c56042913960600191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e808015610458573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b61048b816104e6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104ef8161054e565b61052a5760405162461bcd60e51b815260040180806020018281038252603681526020018061058f6036913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b3b15159056fe5472616e73706172656e745570677261646561626c6550726f78793a206e65772061646d696e20697320746865207a65726f20616464726573735570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e74726163745472616e73706172656e745570677261646561626c6550726f78793a2061646d696e2063616e6e6f742066616c6c6261636b20746f2070726f787920746172676574a264697066735822122090c377aaf4226453bc11a4d3569b56498c596cfd128747512a8e6687b2339d8d64736f6c63430006040033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5570677261646561626c6550726f78793a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374

此时计算_data如下

web3js.eth.abi.encodeFunctionCall({
    name: 'initialize',
    type: 'function',
    inputs: [{
        type: 'address',
        name: 'bep20Impl'
    },{
        type: 'uint256',
        name: 'fee'
    },{
        type: 'address',
        name: 'ownerAddr'
    },{
        type: 'address',
        name: 'bep20ProxyAdminAddr'
    }]
}, ['0x41941cC749d561A13A3a8295f355033D23fDc060',100000000, '0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa','0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0']);

得到

0x358394d800000000000000000000000041941cc749d561a13a3a8295f355033d23fdc0600000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000bb93fcc2bb90d46255c43dd398a1a372e12be6aa00000000000000000000000048f155527f25eb1d4cb2aa32b7e84692aa0025c0

最终三个参数为

  • _logic0xc5612639db6250a9e44A7d846fe60adCE1f65E53
  • Admin_0xF8329Ea42489C2164F44A81DEb3bE22c2C456109
  • _data0x358394d800000000000000000000000041941cc749d561a13a3a8295f355033d23fdc0600000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000bb93fcc2bb90d46255c43dd398a1a372e12be6aa00000000000000000000000048f155527f25eb1d4cb2aa32b7e84692aa0025c0

部署后的地址:0x2dd3DC6ec3ddC15d05C3719EB329a7E64e00Aad5

BSC合约管理地址

升级管理地址:0xF8329Ea42489C2164F44A81DEb3bE22c2C456109
逻辑合约管理地址:0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa
Bep20合约管理地址:0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0

Swap程序部署

编译程序

git clone https://github.com/binance-chain/bsc-eth-swap.git
make build

编译完,服务程序会生成在bsc-eth-swap\build\swap-backend

config配置

由于没有文档,还是看代码吧,先查看demo config config\config.json,以及config解析的代码
从代码角度完善配置参数以及参数作用。

{
  "key_manager_config": {
    "key_type": "local_private_key",
    "aws_region": "",
    "aws_secret_name": "",

    "local_hmac_key": "",
    "local_bsc_private_key": "",
    "local_eth_private_key": "",
    "local_admin_api_key":"",
    "local_admin_secret_key":""
  },
  "db_config": {
    "dialect": "sqlite3",
    "db_path": "./build/test.db"
  },
  "chain_config": {
    "balance_monitor_interval": 60,

    "bsc_observer_fetch_interval": 1,
    "bsc_start_height": 6010146,
    "bsc_provider": "https://ropsten.infura.io/v3/c4f8f662c565463e8e3285708cb41823",
    "bsc_confirm_num": 2,
    "bsc_swap_agent_addr":"0x2dd3DC6ec3ddC15d05C3719EB329a7E64e00Aad5",
    "bsc_explorer_url": "https://ropsten.etherscan.io/tx",
    "bsc_max_track_retry": 60,
    "bsc_alert_threshold": "1000000000000000000",
    "bsc_wait_milli_sec_between_swaps": 100,

    "eth_observer_fetch_interval": 10,
    "eth_start_height": 8018001,
    "eth_provider": "https://goerli.infura.io/v3/87aba2e668f9410498cdf74bc7a35467",
    "eth_confirm_num": 1,
    "eth_swap_agent_addr": "0x31366023017888A1ef48ca60cbB5de26aCBe6b02",
    "eth_explorer_url": "https://goerli.etherscan.io/tx",
    "eth_max_track_retry": 600,
    "eth_alert_threshold": "1000000000000000000",
    "eth_wait_milli_sec_between_swaps": 200
  },
  "log_config": {
    "level": "INFO",
    "filename": "build/test.log",
    "max_file_size_in_mb": 100,
    "max_backups_of_log_files": 1,
    "max_age_to_retain_log_files_in_days": 30,
    "use_console_logger": false,
    "use_file_logger": true,
    "compress": false
  },
  "alert_config": {
    "telegram_bot_id": "",
    "telegram_chat_id": "",
    "block_update_timeout": 10
  },
  "admin_config": {
    "listen_addr": ":8000"
  }
}

启动程序

./build/swap-backend --config-type local --config-path config/config.json

unknown block

由于现有项目不支持 EIP-1559,导致解析 block head错误,block hash无效,报 unknown block

支持EIP-1559

更新 go-ethereum模块
go get github.com/ethereum/go-ethereum@v1.10.8

需要重新生成\bsc-eth-swap\abi\*.goabi.go文件
需要准备合约编译工具环境

首次需要安装solc
sudo pip3 install solc-select
sudo solc-select install 0.6.4 //安装指定版本solc
solc-select use 0.6.4

查看solc安装位置

whereis solc
/usr/local/bin/solc /home/surou/.local/bin/solc

添加到环境变量,或者移动到默认/usr/bin

sudo cp /usr/local/bin/solc  /usr/bin

查看版本solc版本

solc --version
solc, the solidity compiler commandline interface
Version: 0.6.4+commit.1dca32f3.Linux.g++
首次需要安装protobuf
sudo apt install protobuf-compiler

编译go-ethereum

git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum/
make all

最终生成在go-ethereum\build\bin\abigen
复制到全局

sudo cp ./build/bin/abigen /usr/bin/

重新生成abi和bin

git clone https://github.com/binance-chain/eth-bsc-swap-contracts.git
cd eth-bsc-swap-contracts/
npm run flatten //合并依赖为单文件
cd eth-bsc-swap-contracts/contracts/flattened
BSCSwapAgentImpl
solc --bin ./BSCSwapAgentImpl.sol > BSCSwapAgent.bin //生成文件中只保留BSCSwapAgentImpl独立内容
solc --abi ./BSCSwapAgentImpl.sol > BSCSwapAgent.abi //生成文件中只保留BSCSwapAgentImpl独立内容
abigen --bin=BSCSwapAgent.bin --abi=BSCSwapAgent.abi --pkg=BSCSwapAgent --out=BSCSwapAgent.go
ETHSwapAgentImpl
solc --bin ./ETHSwapAgentImpl.sol > ETHSwapAgent.bin //生成文件中只保留ETHSwapAgentImpl独立内容
solc --abi ./ETHSwapAgentImpl.sol > ETHSwapAgent.abi //生成文件中只保留ETHSwapAgentImpl独立内容
abigen --bin=ETHSwapAgent.bin --abi=ETHSwapAgent.abi --pkg=ETHSwapAgent --out=ETHSwapAgent.go

回到 \bsc-eth-swap\abi目录,将上面生成的BSCSwapAgent.go,BSCSwapAgent.abi,ETHSwapAgent.abi,ETHSwapAgent.go 文件覆盖过来
然后把 BSCSwapAgent.goETHSwapAgent.go中的package改为abi

ERC20
cd eth-bsc-swap-contracts/
sudo npm install -g truffle-flattener
truffle-flattener node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol > contracts/flattened/ERC20.sol

同上将contracts/flattened/ERC20.sol 复制到 \bsc-eth-swap\abi目录中

cd `bsc-eth-swap/abi`
solc --bin ./ERC20.sol > ERC20.bin // 删除多余注释
solc --abi ./ERC20.sol > ERC20.abi // 删除多余注释
abigen --bin=ERC20.bin --abi=ERC20.abi --pkg=ERC20 --out=ERC20.go

修改后的代码已提交

git clone https://github.com/bcskill/bsc-eth-swap.git

常见问题

  • Cannot convert string to buffer. toBuffer only supports 0x-prefixed hex strings and this string was given: 0x0NaN
    把逻辑合约重新部署下,用新地址再试下,或者确认下逻辑合约初始化函数参数,是否与encodeFunctionCall参数一致
  • admin cannot fallback to proxy target
    不能拿升级管理权限地址操作逻辑合约,逻辑合约管理权限地址不能与升级管理权限地址相同

注意

  1. encodeFunctionCall执行时,参数要与函数方法参数顺序一致

在线工具

https://www.sojson.com/yasuoyihang.html

理解以太坊的Layer 2扩容解决方案:状态通道(State Channels)、Plasma 和 Truebit

对于以太坊来说,2018年是专注底层架构之年。今年很多早期参与者会测试网络极限,并且重新关注以太坊的扩容技术。

以太坊仍然处于起步阶段。直到现在,它仍然没有那么安全或者可扩展。对于任何密切关注以太坊技术的人来说,这都是很好理解的。但在过去一年,ICO推动的炒作已经过分夸大了目前的网络能力。以太坊和web3的美好愿景—— 一个安全,易于使用的去中心化网络,由一系列通用的经济协议来约束,并且被数十亿人来使用——这个承诺希望在即,但是只有在关键的底层架构完成的前提下才能实现

那些正在致力于构建以太坊的底层架构以及扩展其性能的项目通常被称为扩容解决方案。这些方案有很多种形式,并且常常彼此兼容或互补。

在这篇长文中,我想深入探讨某一类扩容解决方案:“链下(off-chain)”或者说“layer 2”解决方案

  • 首先,我们来总体讨论下以太坊(以及所有公链)的扩容挑战。

  • 其次,我们会介绍解决扩容挑战的不同方法,并且会区分“layer 1”和“layer 2”解决方案。

  • 第三,我们会深入研究layer 2解决方案并且解释它是如何工作的——具体来说,我们会讨论状态通道PlasmaTruebit

本文的重点是让读者能够对于layer 2解决方案工作原理有一个完整和详细的概念性理解。但是我们不会深入研究代码或特定的实施方案。反之,我们会专注于理解用来构建这些系统的经济机制,还有一些在所有layer 2扩容技术中得以共享的共识。

1. 公链的扩容挑战

首先,重要的是理解“扩容”并不是一个单一的、特定的问题。它指的是一系列以太坊必须要解决的挑战,从而以太坊才能被全球数十亿人使用。

最常讨论的扩容挑战是交易吞吐量问题。目前,以太坊每秒可以处理大约15笔交易,而相比而言Visa的处理能力大约为45,000/tps。在过去一年,一些应用例如以太猫,或者偶发的ICO,都足够火爆,能让以太坊网络“降速”并且会提高交易费用(gas)。

像以太坊这种公链的关键限制在于,每一笔交易都需要被网络中的每一个节点处理。以太坊区块链上的每个操作,一笔交易,以太猫的诞生,部署新的 ERC20 合约,每一个发生在以太坊区块链上的操作都必须由网络中的每个节点并行处理。这是设计理念决定的,它是保证公链权威性的一部分。节点们不用依赖其他节点来告诉它们,区块链的当前状态是什么,它们自己就能搞清楚。

这就从根本上给以太坊网络的交易吞吐量造成了限制:它不能高于我们对单个节点所要求的交易吞吐量。

我们可以让每个节点去承担更多工作。如果我们将区块的大小加倍(也就是区块的gas值限制),也就意味着每个节点处理每个区块的工作量大致是之前的两倍。但是这就带来了影响去中心化的代价问题:节点需要做更多工作意味着低性能的计算机(例如消费级设备)可能会退出以太坊网络,如果算力集中在高性能节点运营者手中,挖矿就变得非常中心化。

所以,我们需要找到让区块链能够在不提高单个节点工作量的情况下,负担更多有用工作的方法。

从概念上来说,有两种方法可以解决这个问题

Ⅰ. 如果每个节点不必并行处理每一项操作会怎么样?

第一种方法和我们预设的前提不同,如果我们构建一个区块链,其中每个节点不需要都去处理每个操作会怎么样?如果网络被分成两部分,它们还可以半独立的进行操作,又会怎么样?

A部分可以处理一批交易,同时B部分可以处理另一批交易。这样就可以有效地使区块链的交易吞吐量翻倍,因为我们的限制现在能够被两个部分同时处理。如果我们将区块链分为很多不同的部分,那么我们就可以把区块链的吞吐量提高很多倍。

这就是“分片”技术背后的见解,“分片”是由Vitalik的以太坊研究团队和其他社群提出的扩容解决方案。区块链被分成很多部分,它们被称为“分片”,每个分片都可以独立地处理交易。分片通常被称为是“layer 1”扩容解决方案,因为这是在以太坊底层协议上实现的。如果您想了解有关分片的更多内容,我建议您阅读extensive FAQ这篇博文

II. 如果在以太坊现有处理交易能力之外去进行更多有效操作会怎么样?

第二种选择是从反方向进行考虑的:并不是提高以太坊区块链本身的能力,如果我们可以利用已有的能力做更多的事情,会怎么样呢?底层以太坊区块链的吞吐量是相同的,但是实际上我们可以做更多对于人们和应用程序有用的操作,例如交易,游戏中的状态更新,或是简单的计算。

这就是类似状态通道PlasmaTruebit等“链下”技术背后的见解。当然,这些技术都在解决不同的问题,但它们都是通过“链下”操作,而不是在以太坊区块链上进行操作,同时仍然保证了足够的安全性和不可更改性。

这些也被称为“layer 2”解决方案,因为它们是构建在太坊主链“之上”的。他们不需要更改底层协议,他们只是以基于以太坊的智能合约的形式存在,与链下的软件进行交互。

2.layer 2扩容解决方案是加密经济解决方案

在深入了解具体的layer 2扩容解决方案前,了解使得他们可行的底层概念是非常重要的。

支撑公有链最基础的动力源泉就是加密经济共识。通过仔细协调激励机制以及通过软件和加密算法对激励进行保障,我们就可以创建对于系统内部状态达成共识的可靠计算机网络。这就是中本聪白皮书中的关键见解,并且这种见解现在也被应用在许多不同公链的设计中,包括比特币和以太坊。

加密经济共识给予我们一个确定性的核心——除非有极端事件例如51%×××发生,否则我们都知道链上操作——例如支付或者智能合约,会像写定的那样执行。

在layer 2解决方案背后的见解,就是我们可以把核心内核的确定性作为锚定——我们附加其他经济机制的一个固定点。 第二层的经济机制可以向外扩展公链的效用,让我们能够进行链下交互,如果有需要的话,仍然可以可靠地转回到核心内核上。

这些构建在以太坊底层“之上”区块链层,并不总是与链上操作具有相同的保障。但是它们仍然有足够的不可更改性和安全性,所以仍然是非常有用的。尤其是当不可更改性的要求略微下降时,我们能以更快的速度或更低的开销来进行操作。

加密经济并不是随着中本聪的白皮书而开始和结束,它只是一种我们正在学着应用的技术。加密经济不仅体现在对于核心协议的设计,还体现在对于第二层系统的设计,其扩展了底层区块链的功能性。

I. 状态通道(State channels)

状态通道(State Channel)是一种用于执行交易和其他状态更新的“链下(off-chain)”技术。但是,一个状态通道“内”发生的事务仍保持了很高的安全性和不可更改性。如果出现任何问题,我们仍然可以选择回溯到链上交易中确定的“稳定内核”。

大部分读者会对支付通道(payment channel)比较熟悉,这一概念已存在多年了,并且最近通过闪电网络(lightning network)部署在了比特币上。状态通道是支付通道泛化出来的形式,它们不仅可用于支付,还可用于在区块链上进行任意的“状态更新”,就像在智能合约内部进行更改一样。 2015 年,Jeff Coleman 第一次详细介绍了状态通道。

解释状态通道的运作方式的最佳方法就是来看一个样例。请记住这是一个概念性的解释,也就是说我们不会涉及具体实现的技术细节。

现在设想Alice和Bob想玩一场井字游戏,胜者可以获得一个eth。为了实现这一目标,最简单的方法就是在以太坊上创建一个智能合约,它可以实现井字游戏规则并跟踪每个玩家的动作。每次玩家想要移动时,他们都会向合约发送一个交易。当一名玩家获胜时,根据规则描述,合约会付给胜者一个eth。

这样做是可行的,但是效率低下并且速度很慢。Alice和Bob正在让整个以太坊网络处理他们的游戏过程,这对于他们的需求来说有点过于夸张。玩家每想要移动一步都需要支付gas费用,并且还要在进行下一步移动之前等待区块打包。

但是,我们可以设计一个新的系统,它能使Alice和Bob在玩井字游戏时产生尽可能少的链上操作。 Alice和Bob能够以链下的方式更新游戏状态,同时又很确定计算结果在需要时仍能将其恢复到以太坊主链上验证。我们把这个系统称之为“状态通道”。

首先,我们在以太坊主链上创建一个能够理解井字游戏规则的智能合约“Judge”,同时它也能够确认Alice和Bob是我们游戏中的两位玩家。该合约持有一个eth的奖励。

然后,Alice和Bob开始玩游戏。Alice创建并签署一个交易,它描述了她游戏的第一步,然后将其发送给Bob,Bob也对交易签了名,再将签名后的版本发回并为自己保留一份副本。然后Bob也创建并签署一个描述他游戏中第一步的交易,并发送给Alice,她也会对交易签名,再将其发回,并保留一份副本。每一次,他们都会这样互相更新游戏的当前状态。每一笔交易都包含一个“随机数”,这样就使我们可以直接知道游戏中移动的顺序。

到目前为止,还没有发生任何链上的操作。Alice和Bob只是通过互联网向彼此发送交易,还没有任何东西传达到区块链上。但是,所有交易都可以发送给 Judge 合约,换句话说,它们是有效的以太坊交易。你可以把这看作两人彼此来回填写了一系列经过区块链认证的支票。实际上,并没有钱从银行中存入或取出,但是每人都有一堆可以随时存入的支票。

当Alice和Bob结束游戏时(可能是因为Alice赢了),他们可以通过向 Judge 合约提交最终状态(比如,交易列表)来关闭该通道,这样就只需要付一次交易费用。Judge合约会确定双方都对这个“最终状态”签名,并等待一段时间来确保没人会对结果提出合理质疑,然后向Alice支付一个eth的奖励。

为什么我们需要设置让 Judge 合约等待一下的”质疑时间“?

想象Bob并没有给 Judge 合约发送真实的最终状态,而是发送一份之前他赢了Alice的状态。但是 Judge 仅仅是一份合约,它本身无法知晓这是否是最新的状态。

而质疑时间给了Alice一个机会向 Judge 合约证明Bob对游戏最终状态撒了谎。如果有更近期的状态,她就会有一份已签名交易的副本,并且可以将其提供给 Judge合约。Judge 合约可以通过检查随机数来判断Alice的版本是否是最新的,然后驳回Bob窃取胜利的企图。

特性和限制

状态通道在许多应用中都很有用,它们对于在链上执行操作进行了严密的改进。但重要的是要注意,在决定应用程序是否适合被通道化时,需要做出一些特定的权衡:

  • 状态通道依赖于有效性
    如果Alice在质疑时间内掉线了(可能是Bob渴望赢得奖品,破坏了她家的网络连接),她可能无法在质疑时间结束前做出回应。但是,Alice可以付费给其他人,让其保存一份她的状态副本,并作为她的权益代表,以保持系统的有效性。
  • 当参与者将在长时间内交换大量状态更新时,状态通道非常有用
    这是因为部署 Judge 合约时创建一个通道会产生初始成本。但是一旦部署完成,该通道内每一个状态更新的成本都会非常低。
  • 状态通道最适于有一组确定参与者的应用程序
    这是因为 Judge 合约必须始终知晓所有参与到给定通道的实体(比如,地址)。当然我们可以增加或删除用户,但是每次都需要更改合约。
  • 状态通道有很强的隐私性
    因为一切都参与者之间的通道“内”发生,而不是公开广播并记录在链上。只有开头和结尾的交易必须公开。
  • 状态通道具有即时终结性
    这意味着只要双方都签署了一个状态更新,这个状态就可以被认为是最终状态。双方都有明确保证,如果有必要,他们可以将状态“强制执行”到链上。

我们 L4 团队正致力于创建 Counterfactual框架:一个能在以太坊上推广普及使用状态通道的框架。我们的总体目标是使开发者可以在他们的应用程序中以模块化的方式使用状态通道,而不需要成为状态通道的专家。你可以在这里了解更多该项目的信息。我们将在 2018 年的第一季度发布技术细节文件。

另一个值得注意的针对以太坊的状态通道项目是 Raiden,该项目目前正致力于构建一个支付通道网络,使用了和闪电网络类似的范式。这意味着你不必与想要交易的特定人员开通状态通道。你可以与一个连接到更大型通道网络的实体架设一个单独的通道,这样你就能够向连接到同一网络的任何人支付而无需额外费用。

除了 Counterfactual 和 Raiden,在以太坊上还有几个用于特定于应用程序的状态通道。例如,Funfair 就为他们的去中心化×××构建了他们称之为“Fate channels”的状态通道,SpankChain 为成人产业演员构建了一套单向支付通道(他们还为其 ICO 使用了状态通道),还有 Horizon Games 也在他们的第一款基于以太坊的游戏中使用了状态通道。

II. Plasma

2017 年 8 月 11 日,Vitalik Buterin 和 Joseph Poon 发表了一篇题为《Plasma:自主智能合约》( Plasma: Autonomous Smart Contracts)的论文。这份论文介绍了一种新技术,它能使以太坊每秒可以处理的交易远比现在更多。

就像状态通道一样,Plasma 是一种管理链下交易的技术,同时依靠底层的以太坊区块链来实现其安全性。但是 Plasma 采用了一种新思路,它是通过创建依附于以太坊“主”区块链的“子”区块链。这些子链又可以相应地产生它们自己的子链,子链的子链又可以产生子链,如此递进下去。

其结果就是,我们可以在子链级别上执行许多复杂的操作,在与以太坊主链保持最低限度交互的情况下,运行拥有数千名用户的整个应用程序。Plasma 子链可以更快地操作,承担的交易费用更低,因为子链上的操作无需在整个以太坊区块链上进行重复。

plasma.io/plasma.pdf

为了弄清楚 Plasma 的运行原理,我们来看一个如何使用它的样例。

让我们试想你正在创建一个基于以太坊的集换式卡牌游戏。这些卡牌是一些基于 ERC 721 不可替代的token(比如 Cryptokitties),但是拥有一些特定的特征和属性,可以让玩家相互对战——就像炉石传说或者万智牌一样。这种复杂操作在链上执行的成本很高,所以你决定在你的应用程序中使用 Plasma 作为替代方案。

首先,我们在以太坊主链上创建一系列的智能合约,它们可作为 Plasma 子链的“根节点”。Plasma 根节点包含了子链的基本“状态交易规则”(诸如“交易无法消费已消费过的资产”),也记录了子链状态的哈希值,并建立一种允许用户在以太坊主链和子链间转移资产的“桥接”服务。

然后,创建我们的子链。子链可以拥有自己的共识算法,在这个例子中,我们假设它使用了 PoA(Proof of Authority),POA是一种依赖于可信区块生产者(比如,验证者)的简单共识机制。在“工作量证明”系统中,区块生产者与 POW 系统中的矿工类似,它们是接收交易,形成区块并收取交易费用的节点。为了让样例简单点,假设你(也就是创建游戏的公司)是创建区块的唯一实体,即你的公司运行着几个节点,这些节点就是子链的区块生产者。

一旦子链创建并激活,区块生产者会定期的向根节点合约进行提交。这意味着他们实际上在说“我提交的 X 是子链中当前最新的区块”。这些提交被当做子链中事务的证明,链上记录在 Plasma 根节点里。

现在子链已经准备好了,我们可以创建集换式卡牌游戏的基本组件。这些卡片是基于 ERC721,在以太坊主链上初始化,然后由 Plasma 根节点转移到子链上。这里引入了一个关键点:Plasma 可以扩展我们与基于区块链的数字资产的交互,但是这些资产应当首先创建在以太坊主链上。然后,我们将实际的游戏应用程序以智能合约的方式部署到子链上,这样子链就包含了游戏所有的逻辑和规则。

当用户想要玩我们的游戏时,他们只需要和子链交互。他们可以持有资产(ERC721 卡牌),可以为了以太币购买并交换它们,可以与其他用户对战,还有其他任何游戏中允许的行为,而这些行为都不需要与主链直接交互。因为只有很少的节点(比如,区块生产者)才需要处理交易,所以交易费会很低,操作也能更快。
但是这种模式安全吗?
通过把更多操作从主链迁移到子链上,很明显我们可以执行更多的操作了。但是这样安全吗?发生在子链上的交易是否具备权威性?毕竟,我们方才描述的系统只有一个中心实体控制着子链的区块生产。这样不是中心化吗?这样公司不是随时都能窃取你的资产或者拿走你收集的卡牌吗?

简而言之,即使是在子链中单个实体完全控制所有区块生产的情况下,Plasma 也为你提供了一个基本保证,即你始终都可以将你的资金和资产退回到主链上。如果一个区块生产者开始恶意行事,最坏的情况也仅仅是强迫你离开这个子链。

让我们了解一下区块生产者能恶意行为的几种方式,同时了解 Plasma 会如何处理这些情况。

首先,想象一个区块生产者试图通过说谎欺骗你,他们可以通过创建一个伪造的新区块,声称你的资金被他们控制了。由于他们是唯一的区块生产者,所以他们可以自由引入一个并不遵循我们区块链规则的新区块。就像其他区块一样,他们也得将这个区块存在的证据提交给 Plasma 根节点合约。

如上所述,用户有能将他们的资产随时退回到主链上的最终保障。在这个情景下,用户(或者更确切来说是代表他们权益的应用程序)会侦测到这种盗窃的企图,并在区块生产者尝试和使用他们“偷到”的资产之前把自己的资产撤回到主链上。

Plasma 还创建了一种机制,防止欺诈时不能退回到主链上。Plasma 包含了一种机制,任何人(包括你)都可以向根节点合约发布欺诈证明(fraud proof),试图证明区块生产者作弊。这个欺诈证明会包含之前区块的信息,并且允许我们证明,根据子链中的交易状态规则,这个错误的区块并不能正确接上之前的状态。如果欺诈被证实,那么子链就会“回滚”到前一个区块。更妙的是,我们还构建了一种体系:任何签出错误区块的区块生产者会被处罚,他们会因此丢失链上的保证金。

plasma.io/plasma.pdf

但是提交欺诈证明需要访问底层数据,即需要用之前的实际区块历史来证明欺诈。如果区块生产者为了防止Alice向根节点合约提交欺诈证明,而并没有共享之前区块的信息的话,那怎么办?

在这种情况下,Alice的解决方案就是收回资产并脱离子链。本质上说,爱丽丝向根节点合约提交了一份“欺诈证明”。在一段延迟期内,任何人都可以质疑该证明(比如,展示后面的合法区块证明实际上她消费了这些资产)。之后,Alice的资产将会被移回到以太坊主链上。

plasma.io/plasma.pdf

最后,区块生产者可以审查子链中的用户。如果区块生成者愿意,他们可以直接不在其区块中包含特定交易,从而有效阻止用户在子链上执行的任何操作。如上所述,解决方案仅仅是把我们所有的资产退回到以太坊主链上就可以了。

但是,资产退回本身也会带来风险。其中一个问题就是如果所有使用这一子链的用户同时都要退回资产会怎么样。在这种大量提现的情况下,以太坊主链可能没有足够的容量来处理每个人在质疑期内的交易,也就意味着用户可能会丢失资金。尽管有许多可能的技术能够防止这种情况发生,例如,通过延长质疑时间的方式来响应资产退回的需求。

值得注意的是,并不是所有的块生产者都必定被一个实体所控制——这只是我们案例中的极端个例。我们可以创建子链,把区块生产者分布在许多不同实体间,即像公有链一样真正地去中心化。在这种情况下,区块生产者如上述方式进行干预的风险更小,而用户不得不将资产转移回以太坊主链的风险也更小。

现在我们已经介绍了状态通道和 Plasma,以下几点对比值得注意。

它们之间一个不同之处在于,当状态通道中所有参与方都一致同意退回资产时,状态通道可以立即执行退回。如果Alice和Bob同意关闭通道并撤回他们的资金。只要他们都认同最终状态,他们就可以立即从状态通道取得他们的资产。这在 Plasma 上是不可能的,如上所述,用户在取出资产的过程中必须经历一个质疑时间。

与 Plasma 相比,状态通道每笔交易的平均交易费更便宜,而且速度更快。这意味着我们应该可以在 Plasma 子链上构建状态通道。例如,一个应用程序中两个用户在进行一系列的小型交易。在子链级别构建状态通道应该会比直接在子链上执行每个交易更加便宜和迅速。

最后,需要注意的是这些只是部分描述,我们还遗漏了许多细节。Plasma 本身还处于非常早期的阶段。如果你有兴趣了解 更多关于 Plasma 的现状,可以查看 Vitalik 最近的一个关于 “最小化可行性Plasma(Minimal Viable plasma)” 的提议(即精简的 plasma 实施方案)。一个台湾的团队正在进行这项工作,可以在这个代码库中查看。OmiseGo 正在研究他们的去中心化交易的实施,他们在这里发布了进度最近更新信息。

III. Truebit

Truebit 是一种帮助以太坊在链下进行繁重或复杂计算的技术。这使得它与状态通道和Plasma不同,它们对于提高以太坊区块链的总交易吞吐量更有用。正如我们在开篇部分所讨论的那样,扩容是一个多方面的挑战,需要的不仅仅是更高的交易吞吐量。Truebit不会让我们完成更多的交易,但它能让基于以太坊的应用程序去处理更复杂的事务,并且仍能被主链验证。

这就让我们能够对以太坊应用程序做一些有用的操作,这些操作的计算成本太高,无法在链上执行。例如,验证来自其他区块链的简单支付验证(SPV)证明,这个证明可以让以太坊智能合约“检查”交易是否在另一个链上已经发生(如比特币或狗狗币)。

让我们看一个例子。试想你有一些代价很高的计算(比如 SPV 证明)需要作为以太坊应用程序的一部分来执行。你不能单纯的把它当做以太坊主链上智能合约的一部分,因为SPV证明的计算成本是非常昂贵的。请记住,因为每个节点都要并行处理这种操作,所以在以太坊上直接进行任何计算都是非常昂贵的,。以太坊的区块有最大费用(gas值)限制,从而为该区块中所有交易能执行的计算总量设置了上限。但是SPV证明的计算成本实在太大,即使它是区块中唯一的交易,它需要的gas值也是单个区块gas值上限的许多倍。

相反,链下你可以只需要向人支付很少的费用来完成计算。去完成计算并由你付费的这个人被称作解算者(solver)。

首先,解算者支付智能合约中的保证金。然后,你给解算者一份他们需要计算内容的描述,它们运行计算,并返回结果。如果结果是正确的(大多在一秒钟内),他们的保证金将被退回。如果事实证明,解算者并没有正确地执行计算——比如他们欺诈或犯了错误——他们就会失去他们的保证金。

但是我们如何判断结果是正确的还是错误的?Truebit使用一种叫做“验证游戏”(verification game)的经济机制。从本质上讲,我们为其他被称为挑战者的参与方创造了激励,来检查解算者的工作。如果挑战者能够通过验证游戏证明解算者提交了错误结果,那么他们会获得奖励,而解算者则会失去保证金。

因为验证游戏是在链上执行的,所以它不能直接地计算结果(这会破坏整个系统的设计初衷——如果我们可以在链上进行计算,我们就不需要Truebit)。相反,我们强迫解算者和挑战者确定他们意见不一致的具体操作。实际上,我们将双方逼入一个死角——找到导致他们对结果意见不一的具体代码行。

一旦确定了具体的操作,实际上它就足够小到可以由以太坊主链执行了。然后,我们通过以太坊的智能合约执行该操作,该合约一劳永逸地解决了哪一方说了真话,哪些又是谎言或错误。

如果您想了解更多有关Truebit的信息,你可以阅读这篇论文,或者阅读Simon de la Rouviere的博客文章

结论

layer 2解决方案都有一个共同见解:一旦我们有了公链提供的有确定性的核心,我们就可以把它作为加密经济系统的锚定,然后扩展区块链应用的可用性。

现在我们已经研究了一些示例,我们可以更具体地了解layer 2解决方案如何应用这种见解。layer 2解决方案所使用的经济机制往往是互动游戏:它们通过为各参与方创造激励来相互竞争或彼此“检查”工作。区块链应用程序可以假设某个给定的声明可能是真的,因为我们已经为另一方创造了强烈的激励来提供证明其错误的信息。

在状态通道方案中,就是通过给各方机会互相“反驳”,来确定通道的最终状态。在Plasma方案中,就是如何管理欺诈证据和提现的方法。在Truebit方案中,我们通过激励挑战者来证明解算者是错误的,以确保解算者给出真实结果。

这些系统将有助于解决将以太坊扩展到庞大的全球用户群所涉及的一些挑战。有些系统,像状态通道和Plasma,将会增加平台的交易吞吐量。而其他的系统,像Truebit,可以将更困难的计算作为智能合约的一部分,从而开创新的使用案例。

这三个示例仅代表了加密经济扩容解决方案设计可能性的一小部分。我们甚至没有涉及像CosmosPolkadot这样的“跨链协议”所做的工作(尽管这些协议到底是“layer 2”解决方案还是其他东西,这已经完全是另一篇文章的主题)。我们还应该期望发明新的、意想不到的layer 2系统,这些系统可以改进现有模型,或者在速度,不可更改性和开销成本之间提供新的权衡。

比任何特定的layer 2解决方案更重要的是,底层技术的进一步发展以及使其首先成为可能的机制:加密经济的设计。

这些layer 2扩容方案有力证明了像以太坊这样的可编程区块链的长期价值。建立基于layer 2解决方案的经济机制,只有在可编程区块链上才有可能:因为你需要用脚本语言编写执行交互式游戏的程序。由于像比特币这样的区块链只提供了有限的脚本功能,这对于它们来说很困难(或者有些情况下,比如 Plasma,这是完全不可能实现的)。

以太坊允许我们创建layer 2解决方案,以便在速度,不可更改性和成本开销之间找到新的权衡点。这可以让底层区块链更能够适用于更多种类的应用程序,因为面对不同威胁模型的不同类型应用程序会对不同的权衡模式有天生的偏向。对于需要保障乃至国家性范围内的高价值交易时,我们可以使用主链。对于更偏重交易速度的数字资产交易,我们可以使用 Plasma。layer 2方案让我们能够在不影响底层区块链的前提下取得权衡,并保持去中心化和不可更改性。

而且,很难事先预测给定的扩展方案需要哪些脚本功能。当设计以太坊的时候,Plasma和 Truebit还尚未发明。但是因为以太坊是完全可编程的,实际上它能够实现我们能发明的任何经济机制。

区块链技术的价值是建立在加密经济共识的确定性内核,而诸如以太坊这样的可编程区块链才是能够充分利用这种价值的唯一途径。

感谢Vitalik Buterin,Jon Choi,Matt Condon,Chris Dixon,Hudson Jameson,Denis Nazarov和Jesse Walden对本文早期草稿的评论。
转载自:https://www.cnblogs.com/chongdongshequ/p/9700759.html

Cosmos钱包管理和离线交易签名工具

github: https://github.com/hukkinj1/cosmospy

cosmospy

Version 5.0.1

Tools for Cosmos wallet management and offline transaction signing

Installing

Installing from PyPI repository (https://pypi.org/project/cosmospy):

pip install cosmospy

Usage

Generating a wallet

from cosmospy import generate_wallet
wallet = generate_wallet()

The value assigned to wallet will be a dictionary just like:

{
    "seed": "arch skill acquire abuse frown reject front second album pizza hill slogan guess random wonder benefit industry custom green ill moral daring glow elevator",
    "derivation_path": "m/44'/118'/0'/0/0",
    "private_key": b"\xbb\xec^\xf6\xdcg\xe6\xb5\x89\xed\x8cG\x05\x03\xdf0:\xc9\x8b \x85\x8a\x14\x12\xd7\xa6a\x01\xcd\xf8\x88\x93",
    "public_key": b"\x03h\x1d\xae\xa7\x9eO\x8e\xc5\xff\xa3sAw\xe6\xdd\xc9\xb8b\x06\x0eo\xc5a%z\xe3\xff\x1e\xd2\x8e5\xe7",
    "address": "cosmos1uuhna3psjqfxnw4msrfzsr0g08yuyfxeht0qfh",
}

Converter functions

Mnemonic seed to private key

from cosmospy import seed_to_privkey
seed = "teach there dream chase fatigue abandon lava super senior artefact close upgrade"
privkey = seed_to_privkey(seed, path="m/44'/118'/0'/0/0")

Private key to public key

from cosmospy import privkey_to_pubkey
privkey = bytes.fromhex("6dcd05d7ac71e09d3cf7da666709ebd59362486ff9e99db0e8bc663570515afa")
pubkey = privkey_to_pubkey(privkey)

Public key to address

from cosmospy import pubkey_to_address
pubkey = bytes.fromhex("03e8005aad74da5a053602f86e3151d4f3214937863a11299c960c28d3609c4775")
addr = pubkey_to_address(pubkey)

Private key to address

from cosmospy import privkey_to_address
privkey = bytes.fromhex("6dcd05d7ac71e09d3cf7da666709ebd59362486ff9e99db0e8bc663570515afa")
addr = privkey_to_address(privkey)

Signing transactions

from cosmospy import Transaction
tx = Transaction(
    privkey=bytes.fromhex("26d167d549a4b2b66f766b0d3f2bdbe1cd92708818c338ff453abde316a2bd59"),
    account_num=11335,
    sequence=0,
    fee=1000,
    gas=70000,
    memo="",
    chain_id="cosmoshub-3",
    sync_mode="sync",
)
tx.add_transfer(recipient="cosmos103l758ps7403sd9c0y8j6hrfw4xyl70j4mmwkf", amount=387000)
tx.add_transfer(recipient="cosmos1lzumfk6xvwf9k9rk72mqtztv867xyem393um48", amount=123)
pushable_tx = tx.get_pushable()

One or more token transfers can be added to a transaction by calling the add_transfer method.

When the transaction is fully prepared, calling get_pushable will return a signed transaction in the form of a JSON string. This can be used as request body when calling the POST /txs endpoint of the Cosmos REST API.

科普 | Cosmos 区块链的工作原理,Part-1:比较 Cosmos 与比特币、以太坊

编者注:本文对 Cosmos 网络中区块链和比特币、以太坊进行了巨细靡遗的比较。作者先从区块链系统的栈层出发,分析了比特币、以太坊在不同栈层上的技术要点,最后回归到 Cosmos 网络中的区块链,概念解释尤为清晰,是不可多得的解释文。

鉴于文章实在太长,我们在文首附上了目录。

目录

  • Cosmos 是什么?
  • 区块链结构简介
    • 比特币栈层结构
    • 以太坊栈层结构
  • 基于比特币与以太坊构建应用程序
  • Cosmos 区块链结构
    • Cosmos 共识层
    • Cosmos 网络层
    • Cosmos 应用层
  • 结论

    密码学货币产业从未停下脚步。

一切都始于2010年比特币的问世。比特币刚问世时,所有人都认为它是数字货币的圣杯。曾经被认为不可能的事情现在变成了现实:第一个点对点(peer-to-peer,P2P)支付网络出现了。

即便在今天,对事物的信任仍然是最难以琢磨并且最珍贵的资产。比特币通过创建第一个“免信任型”系统,绕过了这一问题。但这仅仅是一个开始。

从那之后,比特币就成为了催生更广泛密码学创新的催化剂,这些创新也导致了一系列新型去中心化系统与金融基础设施的出现:以太坊(Ethereum)、闪电网络(Lighting Network)、EOS、Tezos、Maker…… 这个名单还在不断延长。

但是有一个项目与众不同:Cosmos。

在区块链领域,Cosmos 是一个“新生儿”。虽然它的理念已经出现有一段时间了,但其开发团队一直在背后慢慢地开发以确保 Cosmos 设计及实现的正确性。这也使得 Cosmos 最近才公开推出。

因此,有很多人看过 Cosmos 项目之后却不理解它也就不足为奇了。简单浏览 Cosmos 相关资料并不会让他们能够直观地了解 Cosmos,反而会让他们有更多疑问:

  • 什么是 Cosmos?
  • Cosmos 的工作原理是什么?
  • 与比特币、以太坊相比 Cosmos 有什么不同?
  • Cosmos 的特点是什么?

我已经知道 Cosmos 团队快两年了。老实说,当我第一次听说他们在做什么的时候,我和其他人一样对它的概念一无所知。

但当我更深入地了解 Cosmos 之后,我开始非常欣赏它。我这么说不仅是为了引人注目,是真正地发自内心。

我对 Cosmos 非常着迷,所以我们决定将 TruStory 应用构建为一个 Cosmos 区块链应用。(插播:我将在之后的文章中更详细地阐述我们为什么会做出这个决定)

尽管如此,关于 Cosmos 仍然有很多困惑。所以我决定专门为此写一篇文章。我想让读者对 Cosmos 是什么以及它在区块链世界中的定位有一个更深层次的理解。

你准备好开始了么?理清思绪,带上你的思考帽,系好安全带。我们要开车啦!

Cosmos 是什么?

Cosmos 是这样定义自己的:

“一个由多条独立平行区块链组成的去中心化网络,每条平行区块链均采用 BFT 共识算法(例如:Tendermint 共识)。”

哇,好拗口啊!让我们把这个定义拆分成几个容易理解的部分。

独立平行区块链的去中心化网络
我在这里假设读者已经对区块链非常了解了!不过,我还是快速回顾一下:
简单来说,区块链是一个分布在许多计算机上的数据库,每台计算机上的数据库都保持相同的状态。换句话说,每台计算机上的数据库所包含的数据都完全相同。这些计算机共同组成了所谓的“区块链网络”。

比特币和以太坊都是区块链,而 Cosmos 是由许多这样并行运行的区块链组成的区块链网络。

如果你不能完全理解刚才说的,那么在进一步了解 Cosmos 工作原理之前,你最好再多读一些关于区块链的基础知识。(编者注:中译本见文末超链接《区块链是什么鬼》)

“每条区块链都采用 BFT 共识算法”

BFT 是 “Byzantine Fault-Tolerant(拜占庭容错)”的缩写。一条拜占庭容错的区块链能够在网络中部分节点宕机 以及/或者 作恶(即所谓“拜占庭式节点”)的情况下,保证网络依旧具备“安全性”与“活性”等性质。安全性与活性能够确保区块链网络中每个节点维护相同的状态。

插播:如果你想要更深入地了解什么是安全性(Safety)与活性(Liveness),请阅读我的这篇有关分布式共识的文章。(编者注:中译本见文末超链接《分布式共识的工作原理,Part-2》)

因此,一种 “BFT 共识算法” 乃是定义了计算机间通信与协调、使得区块链具有拜占庭容错能力的算法。Cosmos 网络中的所有区块链都采用某种 BFT 共识算法。

比特币和以太坊的共识算法不是典型的 BFT 算法。所以它们不符合 Cosmos 网络中区块链的定义。(值得注意的是,虽然它们不是拜占庭容错的,但仍然可以让比特币和以太坊等区块链加入 Cosmos 网络,仅仅需要一些额外的步骤。如果你觉得费解,不用担心——我们将稍后对此进行更深入的研究。)

插播:如果你还是不清楚什么是 BFT,我在这篇文章中写得蛮清楚了。(编者注:中译本见文末超链接《分布式共识的工作原理,Part-3》)

“Tendermint 共识算法”

Tendermint 是由 Cosmos 开发者提出并构建的一种 BFT 共识算法。Cosmos 网络中的区块链可以使用 Tendermint 共识或任何其他 BFT 共识算法。稍后我们将在本文了解更多关于 Tendermint 的内容。

简单来说,Cosmos 网络是一个由多条并行运行的独立拜占庭容错区块链组成的生态系统。这些区块链是 独立运行的,并且能够与其他区块链进行 互操作。

现在你可能会想,“为什么区块链之间要进行互操作呢?”

好问题!我们很快就会讲到。但首先我们要回顾一下区块链的结构。

区块链结构简介

在深入研究 Cosmos 生态系统中区块链是如何工作和互操作的之前,让我们先回顾一下区块链结构的基础知识。
正如我们前面所讨论的,区块链是一个多机复制数据库,并且在每台计算机上维护相同的数据。这种类型的分布式系统也被称为“复制状态机”。
复制状态机是一种多机复制的确定性状态机,但因为网络中每台计算机都维护着相同的状态,因此在功能上看起来就像一台单机。
听起来很熟悉,对吧?回顾上文区块链的定义,这里的定义仅仅是将“数据库”替换为“状态机”、“数据”替换为“状态”,相信你能明白我的意思。

“确定性” 可以简单地理解为,给定一个确定的输入,状态机将始终产生相同的输出。在区块链系统中,“确定性”意味着如果你从一个给定状态开始执行相同的事务序列,你总是会得到相同的最终状态。

复制状态机从某个状态启动。每笔有效事务都将导致系统状态转变到下一个状态(这与数据库中条目更新相同:如果你更新某个条目,数据库将迁移到包含该更新后数据条目的新状态)。

复制状态机在概念上有三个栈层:

1)应用层
应用层负责定义状态变迁,并在事务发生后更新状态机状态。

2)网络层
网络层负责将在某一个状态机上执行的事务传播到网络中其他所有状态机上。

3)共识层
共识层由算法组成,负责确保在事务执行后每一台状态机都存储相同的状态(即,某一状态机无法伪造不存在的事务)。

3a)抗女巫攻击层
试图在去中心化公网运行的复制状态机还需要第四层(“抗女巫攻击层”),确保任何一台状态机都不能破坏网络。如果没有这一层,状态机可以通过创建许多假身份来篡改状态,从而获得与其投入不成比例的影响或收益(即,发起女巫攻击)。


总之,应用层负责定义状态与管理状态迁移。网络与共识层负责保持每台机器上状态一致(即,确保网络中每个数据库数据一致)。抗女巫攻击层(显然)负责避免女巫攻击。

现在,让我们看看在比特币区块链和以太坊区块链中是如何定义与实现这些栈层的。

比特币栈层结构

1)应用层

比特币的主要应用是 P2P 交易。比特币使用 Script(一种堆栈式非图灵完备的语言)来定义与执行交易。当发送方通过交易发送比特币时,发送方将使用脚本来编码指定谁才能掌控这笔资金。Script 包含一组操作码或者说命令,发送方可以使用这些操作码来指定要花费一笔比特币所需满足的条件。

2)网络层

当发送方向接收方发送比特币时,该转账交易必须被广播到网络中,才能使矿工将其打包进区块中。比特币使用一种“Gossip 协议”来确保每个节点都会将其接收的所有新区块或交易发送至邻居节点(peer)。Gossip 协议是确保消息在全部节点间传播的 P2P 协议。比特币网络中所有节点都会将其新接收的有效交易立即发送给其邻居节点,从而使得待打包交易能够在几秒钟内通过点对点网络传播到大多数节点。

3)共识层

在交易被转播到网络中后,还需要将其添加到区块链中才能完成转账(即让网络中的计算机都来执行这个事务)。验证交易并将其打包到区块中的过程称为“中本聪共识(Nakamoto Consensus)”。中本聪共识的运行原理可以在其他论坛或文章找到。如果你想深入了解,这篇文章是一个很好的入门文章。

3a)抗女巫攻击层

中本聪共识依赖于“工作量证明(Proof-of-Work)”来防止女巫攻击。基本上,产生一个新区块所需的算力使得比特币共识协议自身能够抵抗女巫攻击。由于矿工需要大量的算力来产生下一个区块,使得他们无法在不增加大量算力(与资金)投入的情况下“伪造”多个身份。

以太坊栈层结构

1)应用层

与比特币不同,以太坊的设计初衷是构建一个能够运行去中心化应用的平台。以太坊包含一种高级语言(即,Solidity),使得开发者能够通过编写智能合约定义去中心化应用的具体功能。EVM(以太坊虚拟机,Ethereum Virtual Machine)是以太坊应用层的核心。EVM 使用 EVM 编译器将智能合约代码编译成字节码,用户可以通过交易的形式,将该字节码上传到区块链之后,EVM 就可以执行这些字节码,从而改变去中心化应用的状态(即,更新以太坊节点存储的该智能合约相关状态)。由于以太坊网络中所有节点均运行 EVM,这也保证所有节点的状态一致。

2)网络层

与比特币相似,以太坊也使用 Gossip 协议,使得节点能够与其邻居节点通信。

3)共识层

为了达成共识,以太坊使用了与中本聪共识相似的“Ethash”,但 Ethash 与中本聪共识有一些关键区别。如果你需要了解以太坊共识算法的工作原理,请阅读我之前的一篇文章。(编者注:中译本见文末超链接《以太坊的工作原理》)

3a)抗女巫攻击层

与比特币一样,Ethash 依赖于工作量证明(目前为止,译者注:未来以太坊 2.0 将切换到 PoS 共识机制)来抵御女巫攻击。

基于比特币与以太坊构建应用程序

我希望以上内容让你对区块链结构有了一定了解。当我们讨论 “比特币” 或 “以太坊”时,这些名字指的是相关的所有栈层。因为比特币和以太坊是由这些栈层组成的整体。

你无法将以太坊智能合约与其底层 Ethhash 共识层分开,也因此单独讨论这两个主题都没有意义。比特币也是如此,不使用中本聪共识与工作量证明你就无法进行比特币交易。

另一方面,Cosmos 采用了一种稍微不同的模式:它将应用层与共识层和网络层分开。

因为 Cosmos 的目标是建立一个区块链网络,所以这样设计是有意义的。在这个区块链网络中,每条区块链是独立的,并且有它自己的需要和要求(即,它自己的应用)。在这种情况下,想要提出一种一刀切的、适合所有区块链的应用层,是行不通的。让我们用几个例子来研究一下原因。

比特币局限性的一个例子
假设我们准备构建一个货币应用程序。在这种情况下,像 Bitcoin Scrypt 这种简单的基于堆栈的脚本语言是最佳选择。比特币脚本语言不仅可以很好地实现从一个地址到另一个地址的价值转移,并且非常简单、不是图灵完备的。

因此,它不太容易受到各种类型安全漏洞的影响,而这些安全漏洞可能会严重影响图灵完备的编程语言。这正是我们在处理货币与价值存储时想要的。但是这种简单也有其局限性。

使用 Scrypt 做任何更复杂的事情(例如:去中心化预测市场)都非常困难。比特币脚本语言不仅受其可执行代码复杂性限制,对于开发者来说也十分不友好。更糟糕的是,比特币区块链交易的处理速度很慢(大约每秒 7 笔交易)。因此,直接在比特币区块链上构建需要高交易吞吐量的应用是不现实的。

以太坊局限性的一个例子

与比特币相反,以太坊的 EVM 与智能合约语言(Solidity)是为了支持更灵活的应用程序而设计的。Solidity 是一种图灵完备的编程语言,因此理论上它可以执行任意算法复杂度的代码。

在实际应用中,由于 Solidity 易出错并易受到安全攻击,所以使用 Solidity 开发任意复杂度的程序是相当困难的。这种特性与处理价值转移的应用程序背道而驰,在后者这个场景种,安全性是最重要的。

此外,智能合约也非常难以升级,从而使得迭代开发非常困难。合约一旦部署上链,你所能做的就只有祈祷它能够平稳运行!与比特币一样,以太坊交易处理速率也非常低(大约每秒能够处理 15 笔交易),因此在以太坊区块链上构建需要高交易吞吐量的应用也是不现实的。

Cosmos 的提出就是为了满足这种实际业务需要,尽管它为此做了一些较大的牺牲。接下来我们将深入研究具体的细节。但在那之前,我们还必须理解 Cosmos 中区块链的三个栈层是什么样的。

Cosmos 区块链结构

首先,我们将从共识层开始了解 Cosmos,以便更好地理解在 Cosmos 上开发应用程序与使用比特币或以太坊有何不同。

Cosmos 共识层

Cosmos 网络中区块链使用 Tendermint 共识算法。Tendermint 是一个 2014 年诞生的开源项目,“旨在解决比特币工作量证明(Proof-of-Work, PoW)共识算法的速度、可扩展性与环境问题”。

Tendermint 共识算法是一个 “无视应用层(application-agnostic)的共识引擎”。从本质上讲,这意味着任何区块链都可以使用 Tendermint 共识算法,它是拜占庭容错的,并且使用 PoS 算法来抵御女巫攻击。

又是一大堆术语!我们好好说道说道。

Tendermint 共识是如何运作的?

回顾一下,共识算法的存在是为了保证事务执行后,状态机中保存的状态一致;而 Tendermint 共识算法定义了一种“能让所有节点对下个区块达成共识”的规则。

让我们看看相关因素及规则是如何运作的吧!

验证者

负责达成状态一致的节点称为“验证者”。任何愿意协助整个网络达成共识的参与节点都能成为验证者;作为回报,验证者会获得交易手续费和区块奖励。Tendermint 整合这些验证者的投票结果,确定下一个区块的正确状态。

通过质押对抗女巫攻击

每个验证者的票都有自己的投票权重,投票权重通常是在创世块产生时确定,或是在开始运行后根据应用层开发者所设计的某些逻辑来决定。一般来说,由验证者锁在系统中的代币量(作为质押品)决定投票权重的大小,这种质押物也被称为“保证金”。

Consensus 共识

按照规则,验证者要按轮次(round)对每一个区块达成共识。每一轮都包含三个基本步骤:提议阶段(Propose)、预投票阶段(Prevote)、预提交阶段(Precommit),以及两个后续步骤:提交阶段(Commit)、新高度阶段(NewHeight)。从抽象角度来看,验证者按照以下协议规则共同决定下一高度要使用什么区块:

  1. 首先是提议阶段,由指定的验证者提出一个区块——每一轮中的提议者都是从有序的列表中按照投票权重的比例,确定性地选择出来的。
  2. 接着进入预投票阶段——每一位验证者广播他们各自的预投票。
  3. 当该轮次中某一区块收到超过 2/3 的预投票,我们就称其为 “polka”。一旦出现 “polka”,就进入下一个阶段。
  4. 进入预提交阶段,由每一个验证者广播他们的预提交的投票。
    • 如果某一特定区块收到超过 2/3 的预投票,就进入提交阶段,这个阶段会将区块加入区块链,并增加区块高度。每当有新的区块加入区块链,所在区块链的区块高度就 +1。
    • 如果失败,则要么返回预投票阶段,要么回到预提交阶段。

要注意的是,在任何高度上,都有可能需要一轮以上的投票才能提交一个区块。因为可能出现以下情况:

  • 被指定的“提议者”在应该提出区块时掉线
  • 提议者所提出的区块违反一些预先定义的规则
  • Tendermint 依靠超时机制确保区块链出块不会遇到延宕。如果在超时前,提议区块没有收到超过 2/3 的预投票,则由新的提议者再次进行提出区块流程。

协议细节详见此处

总的来说,Tendermint 选择了与比特币的中本聪共识、以太坊 Ethash 不同的路线, 让我们做一些重点对比:

确定性与概率性

与中本聪共识和 Ethash 这类概率性共识不同, Tendermint 是确定共识——这意味着 Tendermint 每个区块都是最终确定的,而不像比特币的区块只是处于“很可能”被确定的状态。

我们回顾一下中本聪共识,区块总是处于“未确定”状态——只有确定某个区块在“最长链”上,才能有把握认为该块正在被最终确定,这也是为什么比特币交易需要等“6个区块确认”。


而在 Tendermint 中,验证者成功投票及提交后,区块就立即被确认了。

固定验证者 vs. 可变验证者

中本聪共识及 Ethash 允许矿工随时选择加入或退出,并不需要其他矿工提前知晓。相反地,Tendermint 共识要求维护一个事先知晓且固定的验证者集合,验证者身份是靠他们的公钥来辨认的。

领导 vs. 无领导

中本聪共识及 Ethash 没有指定领导者来提议下一个区块(i.e. 任何矿工都有可能挖到下一个区块)。另一方面,Tendermint 选择领导者,或称为提议者,负责提出下一个区块。

明确的 vs. 模糊的超时机制

中本聪共识和 Ethash 没有使用超时机制来确保矿工一定能出块,而 Tendermint 有明确的超时机制保证区块链的出块过程不会遭遇延宕。

100 个验证者 vs. 1000 个验证者

科普 | Cosmos 与 Polkadot 的五大区别

Cosmos 和 Polkadot 都是关注区块链互操作性的项目,关于二者之间的差别已经有过很多讨论。如果你还不熟悉这两个项目,Linda Xie 发过一串推特介绍过这两个项目,可以作为很好的入门材料。

虽然已经有很多帖子分析过这两个项目的区别了,但是我认为其中大部分都存在一定的偏向性或者不够详细。通过这篇帖子,我会从架构权衡到哲学等方面更深入地探讨这两个项目。

为什么要构建一条新的区块链?

为什么一些项目要选择从头开始构建一条专门承载应用程序的区块链,而不是以智能合约的形式在现有的区块链上编写应用程序呢?主要有以下两点原因。

首先,现有的智能合约平台不一定能满足应用程序所需的灵活性和可定制性。举例来说,如果你想搭建的应用程序需要自定义的哈希函数,那么把它编写到以太坊上会消耗很多 gas ,因为这个函数每调用一次都需要在以太坊虚拟机内执行一次。一种解决方案是提议将这个函数作为预编译合约添加至以太坊协议内。但是,除非这个函数也广泛应用于其它应用程序,否则这项提议大概率是不会通过的。从头开始编写一条新的区块链,你就可以自由灵活地设计区块链的核心逻辑,以此满足你的应用程序的需求。

其次是自治问题。在智能合约平台上构建的应用程序必须接受平台的治理并遵守其规则,从区块时间和 gas 定价之类影响用户体验的规则,到回滚之类改变状态的决策等等。

但相应的,具有自治能力的链失去了与其它应用程序进行无缝通信的能力,因为应用程序都是搭建在使用不同状态机的区块链上。Cosmos 和 Polkadot 都致力于解决这个问题——Cosmos 采用的是 Hub-and-Zone(中心-分区) 模型,Polkadot 则采用的是Relay Chain/Parachain(中继链/平行链)模型。

读者需要对这两个项目有一定的了解,本文侧重于梳理二者的不同点。

1.局部安全 vs 全局安全

Cosmos 和 Polkadot 采用的安全模型差别极大。简单来说,Polkadot 的工作流程如下:

Polkadot 的网络架构

平行链是 Polkadot 网络中的区块链。这些链有自己的状态机、自己的规则和自己的区块生产者,即核验人(collators)。每条平行链本质上都是一个独立的状态机,而且可以使用任何类型的特殊功能、共识算法、交易手续费结构等等。在 Polkadot 网络中,所有平行链都有同一条母链,叫做中继链,里面包含了由所有平行链组成的 “全局状态”。中继链拥有自己的共识算法,叫做 GRANDPA 共识(祖父共识),可以迅速将平行链上的区块确定下来。通过这个模型,Polkadot 的平行链实现了 “安全性共享”——如果中继链上有 1000 名验证者,具有极高的安全性,凡是连接到这条中继链的平行链都会受益。这样一来,平行链即能拥有自己的状态机并自定义规则,又能与成百上千条平行链一起共享母链的安全性。

这种模型的罩门在于由中继链上的验证者来验证平行链上的状态改变。例如,验证者可能会出于某种原因一直拒绝某条链上的核验人提议的区块,而且这条中继链上的区块永远无法被添加进全局状态。为了尽量避免这种情况,Polkadot 对验证者进行混洗,让他们随机验证平行链,降低同一位验证者始终验证同一条平行链的概率。Polkadot 还另设有一类被称为 Fishermen (渔夫)的验证者,他们会不断查验验证者是否存在恶意行为。

Cosmos 采用了完全不同的网络架构。

Cosmos的网络架构

在 Cosmos 网络中,每条链都是独立运行的,并设有自己的安全机制,而非像 Polkadot 那样采用 局部/全局 的安全性模型。每条链都有自己的共识机制,而且由单独的验证者来负责保护这条链的安全性。Cosmos 网络使用中心-分区模型来实现互操作性,每个分区(独立的链)都可以通过中心(同样是一条独立的链)向其它分区 “发送代币”。这个协议被称为 IBC (跨链通信),是链与链之间通过发送消息实现代币转账的协议。IBC 协议尚在开发之中,最开始先支持代币转账,最终会支持各类消息的跨链传递。

相比于 Polkadot 的架构而言,Cosmos 的架构最大的不同之处在于,每个分区的状态仅由各自的验证者保护。一个分区想要获得很强的安全性,就需要建立自己的验证者集,这对于小型应用程序来说会比较困难。不过,对于那些想要获得更多控制权的应用程序来说,这是个很大的亮点。例如,币安最开始就是用自己的节点来充当币安链的验证者,来促进去中心化交易所的持续运行。这样一来,币安在测试币安链并增加新功能的时候就有了充分的控制权。我觉得币安不太可能放弃决定哪些交易可以上链的权力,但若要在以太坊或 Polkadot 平台上开发,就不能不放弃这样的权力。正因如此,我认为 Telegram、Facebook 和 Kakao 这类公司会选择构建自己的区块链并掌握其控制权,未来也不太可能与别的链通信。

2. 治理和参与

Polkadot 和 Cosmos 之间的第二个主要差别在于治理和参与。在 Polkadot 网络中,只有一条中继链和一些与这条中继链共享验证者的平行链。根据目前的估算,平行链的数量上限为 100 条,不过未来有可能减少或增加。Polkadot 网络通过拍卖机制来竞拍平行链的使用权——出价最高的人需要在 PoS 系统中锁定一定数量的 DOT (Polkadot 上的原生货币),才可以在一定时间段内拥有所拍得平行链的使用权。这意味着要想使用 Polkadot 上的平行链,需要购买并锁定大量 DOT ,直到不想再使用这条平行链为止。

Cosmos 网络没有设置固定的参与规则——任何人都可以创建中心或分区。中心就是具有自治能力的区块链,专门用来连接其它区块链。这里有两个例子,一个是 Cosmos Hub,最近已由 Tendermint 团队上线;另一个是 Iris Hub,旨在连接主要运行于中国或其它亚洲国家的区块链 。这种中心-分区模型提高了跨链通信的效率,因为分区链只需要连接到中心,无需连接到其他每条链上。


中心-分区模型可以更高效地连接多条链

由于参与规则不同,这两个网络在治理流程上也存在差异。在 Polkadot 网络中,治理决策取决于投票者所质押的 DOT 数量。关于链上投票会有一套正式机制,不过尚未最终确定下来,点击此处可了解最新进展。除了采取以质押量决定投票权重的机制之外,Polkadot 还组建了一个委员会来代表不活跃的权益持有者。委员会最开始由 6 人组成,每两周增加 1 人,直到满 24 人为止。每位委员会成员均通过赞成投票的方式选出。治理流程的具体细节尚未敲定,也就是说有很多方法可以改变中继链的参数,如出块时间、区块奖励等,以及平行链的参与规则。例如,Polkadot 的治理流程可以改变平行链使用权的竞拍机制或所需的 DOT 数量。有一种常见的误解是 DOT 持有者可以通过投票随意弃用某条平行链。实际上,DOT 持有者只能改变参与流程。也就是说一旦竞拍下了某条平行链,在整个租期之内都享有这条链的使用权。

另一方面,Cosmos 网络不存在单一的 “治理”流程。每个中心和分区都有自己的治理流程,因此没有一套应用于整个系统内所有链的核心规则。我们所说的“Cosmos 治理”指的都是 Cosmos Hub 的治理,即由 Tendermint 团队上线的那条链。Cosmos Hub 的规则是,任何人都可以发送一个文本提议,由 ATOM 持有者进行投票表决,ATOM 的质押量决定了投票权重。想知道提议长什么样子,这里有个例子。如果你想深入了解治理流程的话,可以阅读一下 Chorus One 发布的这篇帖子,是了解 Cosmos Hub 治理机制的入门材料。

3.跨链通信

Polkadot 和 Cosmos 之间的另一个差别是跨链通信协议及其设计目标。Polkadot 旨在实现平行链之间任意的消息传递。也就是说,平行链 A 可以调用平行链 B 中的智能合约,实现与平行链 B 之间的代币转账或是其他类型的通信。Cosmos 则聚焦于跨链资产转移,其协议较为简单。目前,这两种通信协议仍待完善细则,而且尚未构建完成。可以查看 IBC(跨链通信)和 ICMP (平行链之间的跨链通信)这两种协议的细则。

跨链通信所面临的最大挑战不是如何将一条链上的数据在另一条链上表示出来,而是如何处理链分叉和链重组这样的情况。这是 Cosmos 和 Polkadot 在构架设计上最大的差异。

为了确保跨链通信的安全性,Polkadot 采用了两种不同的机制。首先是安全性共享机制,降低了信息交换的难度。 共享安全性的另一个好处是所有平行链都位于同一个安全层级,因此每条链可以彼此信任。为便于理解,我们以以太坊(安全性较高)和 Verge(安全性较低)的交互操作为例。若想在 Verge 链上表示以太坊,我们可以锁定一些以太坊,然后在 Verge 链上生成 ETH-XVG 代币。然而,由于 Verge 链的安全性较低,攻击者可能会向 Verge 链发动 51% 攻击,并向以太坊区块链发送双花交易,就可以取回比实际拥有数量更多的以太币。因此,在互相发送消息的时候,安全性较高的链很难信任安全性较低的链。如果是在安全层级各不相同的链之间互传消息,情况就会变得更加复杂。

从理论上来说,共享安全性是一种保障跨链通信的良好方式。前提是,这种协议要确保能够经常对验证者进行混洗,再随机分配到各条平行链上。这就会造成经典的 “数据可用性问题”,即每次验证者被分配到新的平行链上,就需要下载新链的状态。这是目前区块链领域最大的难题之一,Polkadot 能否解决尚未可知。

其次,Polkadot 引入了 Fisherman(渔夫)的概念,也就是 Polkadot 网络上的 “赏金猎人”,专门监视平行链上的恶意行为。从某种意义上来说,这是抵御恶意行为的“第二道防线”。如果某条平行链的验证者将一个无效块上链,Fisherman 发现后可以向中继链提交证明,将包括所有平行链在内的整个 Polkadot 网络的状态进行回滚。在跨链通信期间,最令我们担心的莫过于一条链在重组,另一条链却运行如常。Polkadot 就避免了这个问题,一旦发现无效块上链,整个网络都会回滚。

Cosmos 采用了完全不同的跨链通信方式。因为每条链上都有自己的验证者,所以很有可能会出现分区中的验证者串谋的情况。也就是说,如果有两个分区需要通信,A 分区需要必须信任 Cosmos Hub(通信枢纽)以及 B 分区中的验证者。从理论上来说,A 分区的人在决定向 B 分区发送信息之前,需要调查一下 B 分区的验证者。不过我觉得实际情况没那么糟糕。 Polychain Labs 或 Zaki Manian 的 iqlusion 等知名验证者节点可能会验证多条链,逐渐建立起良好的声誉。也就是说,当 A 分区的人看到 B 分区是由 Polychain Labs 和 iqlusion 验证的,可能会因此决定信任 B 分区。

然而,即使一条链得到了人们的信任,也有可能被怀有恶意的攻击者控制,出现各种问题。有一段对话中提到了一个很好的例子:

代币分散于不同分区的 Cosmos 网络

假设上图中的小红点代表一种名为 ETM 的代币,即 Ethermint 分区的原生代币。A、B、C 三个分区的用户想要使用 ETM 来运行各自分区内的一些应用程序,而且他们都信任 Ethermint 分区,因此通过跨链通信在各自的分区内接受了一些 ETM 。现在假设 Ethermint 分区的验证者串谋发动双花攻击,任意转移 ETM 代币。这也会对剩余网络造成影响,因为 ETM 代币也存在于其他分区中。不过受波及的只有 Ethermint 或其他分区中的 ETM 代币持有者。Ethermint 分区中的恶意验证者只能毁掉自己的分区,破坏不了其他分区。这就是 Cosmos 架构的目标——确保恶意行为无法影响整个网络。

Polkadot 则不同。如果中继链(全局状态)上发生了无效状态更新,又没被 Fisherman 发现的话,Polkadot 网络中的每条平行链都会受到影响。平行链不能被看作是完全不同的东西,毕竟它们都共享同一个全局状态。

4.共识算法

Polkadot 中继链采用的是 GRANDPA 共识算法。这个算法能让中继链迅速确定来自所有平行链的区块,并且容纳大量验证者(1000 名以上)。简单来说,这是因为并非所有验证者都需要对每一个区块进行投票——他们可以只需为自己认为有效的某个区块投票,相当于这个区块之前的所有区块也都得到了认可。通过这种方式,GRANDPA 算法可以找出一组得票数最多的区块,并将这组区块确定了下来。该算法仍处于开发之中,尚不知实际会如何执行。

平行链可以采用不同的共识算法达成局部共识。Polkadot 提供一个软件开发工具包(Substrate),其中包括 GRANDPA、Rhododendron 和 Aurand 三种开箱即用的共识算法。今后可能会有更多算法被加入 Substrate ,皆可应用于 Polkadot 网络。

在 Cosmos 网络中,每条链可以选用的共识算法有很多,只要是符合 ABCI 规范的共识算法即可。 ABCI 规范旨在实现跨链通信的标准化。目前只有 Tendermint 算法符合这个规范,还有另一些团队也在努力开发符合该规范的其他共识算法。从更抽象的层面上来看,Tendermint 算法的原理是让每位验证者都能互相通信,共同决定一个区块能否上链,这样就能实现单一区块层面上的确定性。该算法的速度很快,而且通过了 200 名验证者的压力测试,在 Game of Stakes(权益争夺赛)中的出块时间为 6 秒。Cosmos 团队也提供了一个软件开发工具包,里面包含了开箱即用的 Tendermint 算法。这篇文章很好地介绍了共识算法,以及 Tendermint 算法的功能。

Tendermint 算法最大的缺点是验证者之间的通信成本高很高。也就是说,虽然验证者人数在 200 左右的时候,算法的运行速度很快,一旦人数涨到了 2000 ,速度就会慢得多。另一方面需要权衡的是异步环境中的安全性。也就是说,在出现网络分区之时,不会出现两个不同的交易历史最终合并成一个(而另一个交易历史被抛弃)的情况,而是整个网络都将停止运行。这点非常重要,一旦一笔交易得到了“最终确认”,即使是在最差的网络环境下也不会被撤销。

我的个人观点是,基于共识算法来比较这两个项目没什么长远意义。这两个项目的构架未来都将接受不同的共识算法。如今的绝大多数应用不管使用的是 Tendermint 算法还是 Polkadot 的某个共识算法都可以良好运行。

5.Substrate vs Cosmos SDK

Polkadot 和 Cosmos 都提供软件开发工具包,分别叫作 SubstrateCosmos SDK 。二者的目的都是为了便于开发者搭建自己的区块链,其中包括各种开箱即用的模块,例如治理模块(投票系统)、质押模块和认证模块等。这两个工具包最主要的区别在于,Cosmos SDK 仅支持 Go 语言,而 Substrate 支持任何可编译为 WASM (Web Assembly) 的语言,给予了开发者更多灵活性。

这两个工具包都是构建区块链的全新框架,未来几年还将新增更多功能。关于这两个工具包的深度剖析以及使用这两个工具包开发应用程序的详细体验需要另外写一篇文章了。如果你感兴趣的话,请在推特上给我 @juliankoh 留言。

结论

虽然这篇文章篇幅很长,写的也很详细,但是依然有所疏漏。Cosmos 和 Polkadot 之间的不同点很难把握,可能还有很多细节我没有捕捉到。要全方位了解这两个项目绝非易事,毕竟项目文件随时都可能改动。这两个项目尚在起步阶段,未来一年将得到极大的发展——我在上文中提到的几个点可能很快就不成立了。总而言之,我认为 Polkadot 相比 Cosmos 主要有以下几个优势:

  1. 应用程序开发者不需要自己维护安全性
  2. 共享安全性模型下的跨链通信更容易解决数据可用性问题
  3. Substrate(在 WASM、更多共识算法和开箱即用模块方面)表现出很大的野心
  4. 相比跨平行链的合约调用更侧重于不限类型的信息传递(这一用例目前尚不明确)
  5. 1.0 版本的开发者似乎多一些

反过来,Cosmos 相比 Polkadot 主要有以下几个优势:

  1. Cosmos 已经上线了,Polkadot 还没上线
  2. Polkadot 的平行链参与流程限制性更强,而且成本更高
  3. 更能满足特定项目(如币安)对自定义的需求
  4. 平行链上验证者的恶意行为会波及整个网络。在 Cosmos 网络中,恶意行为只能破坏个别分区和资产
  5. 已经有很多项目在使用 Cosmos SDK 了
  6. 重点关注如何降低资产转移的难度。目前已经有经过验证的用例。

感谢每一位不厌其烦为我答疑解惑的朋友,尤其是来自 Cosmos 团队的 Zaki ManianGautier Marin ,以及来自 Polkadot 团队的 Alistair Stewart 。NEAR Protocol (Alex Skidanov) 发布的 Whiteboard Series 系列视频很棒,对我理解这两个项目给予了很大帮助。Linda Xie 整理出来的关于 Polkadot 和 Cosmos 的链接帮助我缩小了文章的范围,让这篇文章更具有可读性。特别感谢 Cheryl Yeoh 在我撰写本文的过程中为我提供的灵感和思路,并且对本文进行了审校。

转载自:https://ethfans.org/posts/5-differences-between-cosmos-polkadot