Skip to content

Latest commit

 

History

History
358 lines (253 loc) · 32.4 KB

8 重做调度系统复现实验.md

File metadata and controls

358 lines (253 loc) · 32.4 KB

00 常用命令

genesis.json:

{
    "config": {
        "chainId": 666,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "ethash": {}
    },
    "nonce": "0x0",
    "timestamp": "0x5ddf8f3e",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0xffffffff",
    "difficulty": "0x20000",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {},
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

初始化区块链:

geth1 --identity "MyEth" --rpc --rpcaddr 127.0.0.1  --rpcport "8545" --rpccorsdomain "*" --datadir gethdata --port "30303" --nodiscover --rpcapi "eth,net,personal,web3" --networkid 91036 init genesis.json

启动区块链:

geth1 --datadir ./gethdata --networkid 91036 --port 30303 --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --rpcapi 'personal,net,eth,web3,admin' --rpccorsdomain='*' --ws --wsaddr='localhost' --wsport 8546 --wsorigins='*' --wsapi 'personal,net,eth,web3,admin' --nodiscover --allow-insecure-unlock --dev.period 1 --syncmode='full' console

创建账户:

for (i = 0; i < 8; i++) { personal.newAccount("123456") }

解锁账户:

for (i = 0; i < eth.accounts.length; i++) { personal.unlockAccount(eth.accounts[i],"123456",0) }

01 初始化并启动区块链

新建TaxiSystem文件夹,将00节中的genesis.json内容放置入根目录。在TaxiSystem文件夹下启动终端,分别使用初始化区块链、启动区块链的指令操作,打开JavaScript控制台。

在控制台中,执行00节中的创建账户和解锁账户指令后,利用eth.accounts获取所有账户的地址,使用如下Python程序,生成即将添加进入genesis.json的代码:

# TaxiSystem/accounts_processor.py
l = eth.accounts的输出原样粘贴过来即可应该是["...", "...", ...]的格式

for each in l:
    print(
        f'"{each}": {{ "balance": "50000000000000000000000000000000000000000", "position": "test0123456789", "txtime": 1 }},'
    )

记录该程序的输入,直接粘贴到genesis.jsonalloc字段中去。

该程序的输出的最后一行带有一个多余的逗号,粘贴到genesis.json中去之后请务必删除。

在打开的控制台中输入exit退出控制台,然后删除目录TaxiSystem/gethdata/geth。随后,再运行一次初始化区块链和启动区块链的代码。此时,所有账户应该都有余额了。可以用eth.geBalance(账户地址)来检查余额:

for (i = 0; i < eth.accounts.length; i++) { console.log(eth.getBalance(eth.accounts[i])) }

每次重新启动JS控制台,都需要再解锁一次账户。

02 部署合约

StoreMap合约

首先是StoreMap.sol合约。该合约的Solidity源代码位于仓库的CompileWithTruffle/contracts/StoreMap.sol。使用《9 关于使用truffle编译solidity源代码》中介绍的方法获得abibytecode之后,打开这个用于JSON压缩转义的网站,将获得的abi(形如"abi": [...])丢进去,点击输入框下方的“压缩并转义”,复制走从第一个[开始之后的全部内容。

在打开的控制台中输入如下指令:

abi = JSON.parse("复制来的内容")
bytecode = 获得的bytecode,字符串类型

StoreMapContract = web3.eth.contract(abi);
web3.eth.estimateGas({data: bytecode})
StoreMap = StoreMapContract.new({
    from: web3.eth.accounts[0], 
    data: bytecode, 
    gas: '3000000',
    position:"w2511111111111",
    txtime:277001
  },function (e, contract){
    console.log(e, contract);
    if(!e){
        if(!contract.address) {
            console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
        } else {
            console.log("Contract mined! Address: " + contract.address);
            console.log(contract);
        }
    }
});

开始挖矿,并留意输出:

miner.start()
/*
-- snip --
null [object Object]
Contract mined! Address: 0xef00ade84bb560afe4b562bfd4a81300c17ac52f
[object Object]
-- snip --
*/
miner.stop()  // 停止挖矿以节省电脑性能

这就是StoreMap合约的地址了。妥善保存,以供日后使用。

StoreTraffic合约

该合约的部署较为简单,直接将多节点树状区块链部署中的有关StoreTraffic的一片代码全丢进控制台中然后按一下Enter键即可,其内容如下:

abi = JSON.parse('[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"passengerGeohash\",\"type\":\"bytes32\"}],\"name\":\"Myevent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"boardEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"payEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"}],\"name\":\"rejectEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"}],\"name\":\"routeEvent\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPrecision\",\"type\":\"uint256\"}],\"name\":\"changePrecision\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"confirmBoard\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"confirmPay\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"deleteVehicle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"string\",\"name\":\"geohash\",\"type\":\"string\"}],\"name\":\"getLatBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"string\",\"name\":\"geohash\",\"type\":\"string\"}],\"name\":\"getLonBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"}],\"name\":\"getPassengerEnd\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"end\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"}],\"name\":\"getPassengerPos\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"position\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"getRoutes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"route\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"cost\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerGeohash\",\"type\":\"bytes32\"}],\"name\":\"getVehicle\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerGeohash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"regionVehicles\",\"type\":\"bytes32[]\"}],\"name\":\"getVehicleByRegion\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"getVehicleStatus\",\"outputs\":[{\"internalType\":\"int32\",\"name\":\"\",\"type\":\"int32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"geohash\",\"type\":\"bytes32\"}],\"name\":\"initPassenger\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"geohash\",\"type\":\"bytes32\"}],\"name\":\"initVehicle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nextGeohash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"endGeohash\",\"type\":\"bytes32\"}],\"name\":\"manhattan\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"startGeohash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"endGeohash\",\"type\":\"bytes32\"}],\"name\":\"setPassengerDemand\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"passengerGeohash\",\"type\":\"bytes32\"}],\"name\":\"setPassengerPosition\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"}],\"name\":\"setRejectVehicleStatus\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"vehicleGeohash\",\"type\":\"bytes32\"}],\"name\":\"setVehicle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"passengerGeohash\",\"type\":\"bytes32\"}],\"name\":\"setVehicleStatus\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"}],\"name\":\"setVehicleStatusEmpty\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"geohash1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"geohash2\",\"type\":\"bytes32\"}],\"name\":\"sliceGeoHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cost\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"vehicleId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"passengerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"route\",\"type\":\"bytes32[]\"}],\"name\":\"storeRoutes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]')
bytecode = "0x60806040526000600355600060065560086007556040518060a00160405280601060ff168152602001600860ff168152602001600460ff168152602001600260ff168152602001600160ff16815250600890600562000060929190620000c3565b506040518060400160405280602081526020017f30313233343536373839626364656667686a6b6d6e707172737475767778797a81525060099080519060200190620000ae9291906200011a565b50348015620000bc57600080fd5b50620001c9565b82805482825590600052602060002090810192821562000107579160200282015b8281111562000106578251829060ff16905591602001919060010190620000e4565b5b509050620001169190620001a1565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015d57805160ff19168380011785556200018e565b828001600101855582156200018e579182015b828111156200018d57825182559160200191906001019062000170565b5b5090506200019d9190620001a1565b5090565b620001c691905b80821115620001c2576000816000905550600101620001a8565b5090565b90565b61175b80620001d96000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063501df3f1116100c3578063bf5b1f9b1161007c578063bf5b1f9b146107f8578063c7e63d021461083a578063cf23e7a614610868578063d35a1d0d146108a0578063e464bbd5146108e2578063fdcd80aa146109245761014d565b8063501df3f1146105dc5780635265da351461062557806353f065fd1461065d57806356f90ed4146106a957806368ba6df9146106f1578063964c10a1146107c05761014d565b80632e708dcd116101155780632e708dcd146103575780633d2e10b41461038f5780633f81eee41461046557806344cf2cd7146104a75780634a620efc146105765780634ce00aa9146105ae5761014d565b8063075b8b1d1461015257806308389071146101dc578063118129f41461020a578063135d15cd1461024c578063184968ea1461027a575b600080fd5b61017e6004803603602081101561016857600080fd5b8101908080359060200190929190505050610a41565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156101c75780820151818401526020810190506101ac565b50505050905001935050505060405180910390f35b610208600480360360208110156101f257600080fd5b8101908080359060200190929190505050610ac8565b005b6102366004803603602081101561022057600080fd5b8101908080359060200190929190505050610b06565b6040518082815260200191505060405180910390f35b6102786004803603602081101561026257600080fd5b8101908080359060200190929190505050610b26565b005b61033a6004803603604081101561029057600080fd5b8101908080359060200190929190803590602001906401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460208302840111640100000000831117156102eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610b60565b604051808381526020018281526020019250505060405180910390f35b61038d6004803603604081101561036d57600080fd5b810190808035906020019092919080359060200190929190505050610c4b565b005b610463600480360360808110156103a557600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156103e057600080fd5b8201836020820111156103f257600080fd5b8035906020019184602083028401116401000000008311171561041457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610c6a565b005b6104916004803603602081101561047b57600080fd5b8101908080359060200190929190505050610ceb565b6040518082815260200191505060405180910390f35b610560600480360360208110156104bd57600080fd5b81019080803590602001906401000000008111156104da57600080fd5b8201836020820111156104ec57600080fd5b8035906020019184600183028401116401000000008311171561050e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d27565b6040518082815260200191505060405180910390f35b6105ac6004803603604081101561058c57600080fd5b810190808035906020019092919080359060200190929190505050610ebd565b005b6105da600480360360208110156105c457600080fd5b8101908080359060200190929190505050610f39565b005b610608600480360360208110156105f257600080fd5b8101908080359060200190929190505050610f95565b604051808381526020018281526020019250505060405180910390f35b61065b6004803603604081101561063b57600080fd5b81019080803590602001909291908035906020019092919050505061107f565b005b6106936004803603604081101561067357600080fd5b8101908080359060200190929190803590602001909291905050506110e0565b6040518082815260200191505060405180910390f35b6106d5600480360360208110156106bf57600080fd5b8101908080359060200190929190505050611183565b604051808260030b60030b815260200191505060405180910390f35b6107aa6004803603602081101561070757600080fd5b810190808035906020019064010000000081111561072457600080fd5b82018360208201111561073657600080fd5b8035906020019184600183028401116401000000008311171561075857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111a8565b6040518082815260200191505060405180910390f35b6107f6600480360360408110156107d657600080fd5b81019080803590602001909291908035906020019092919050505061133d565b005b6108386004803603606081101561080e57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061135c565b005b6108666004803603602081101561085057600080fd5b8101908080359060200190929190505050611397565b005b61089e6004803603604081101561087e57600080fd5b8101908080359060200190929190803590602001909291905050506113d1565b005b6108cc600480360360208110156108b657600080fd5b8101908080359060200190929190505050611428565b6040518082815260200191505060405180910390f35b610922600480360360608110156108f857600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061143b565b005b61095a6004803603604081101561093a57600080fd5b8101908080359060200190929190803590602001909291905050506114c2565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561099e578082015181840152602081019050610983565b50505050905090810190601f1680156109cb5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610a045780820151818401526020810190506109e9565b50505050905090810190601f168015610a315780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b60606000806000848152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610aa457602002820191906000526020600020905b815481526020019060010190808311610a90575b50505050509150600080848152602001908152602001600020600101549050915091565b60018060008381526020019081526020016000206002015414610ae757fe5b6000600160008381526020019081526020016000206002018190555050565b600060046000838152602001908152602001600020600101549050919050565b7f3df08102c43128689c0922a6d6509c65890fb8abdefbb11892e7b3a76c681880816040518082815260200191505060405180910390a150565b60008060008060008090505b8551811015610c2857610b7f87846110e0565b610bb288600160008a8681518110610b9357fe5b60200260200101518152602001908152602001600020600101546110e0565b1015610c1b57600060016000888481518110610bca57fe5b60200260200101518152602001908152602001600020600201541415610c1a5760016000878381518110610bfa57fe5b602002602001015181526020019081526020016000206001015492508091505b5b8080600101915050610b6c565b5081858281518110610c3657fe5b60200260200101519350935050509250929050565b8060016000848152602001908152602001600020600101819055505050565b806000808581526020019081526020016000206000019080519060200190610c939291906116b4565b5083600080858152602001908152602001600020600101819055507f9d5989c6dfe7087cf87bc915a07bc23b94c2bbcabdcc61e78249ee5e678fcac8826040518082815260200191505060405180910390a150505050565b60006004600083815260200190815260200160002060030154905060016004600084815260200190815260200160002060040181905550919050565b60008060019050600080905060008090505b8451811015610eb2576000858281518110610d5057fe5b602001015160f81c60f81b9050600080600090505b6009805460018160011615610100020316600290049050811015610e4657827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600982815460018160011615610100020316600290048110610dc457fe5b815460011615610de35790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610e3957809150610e46565b8080600101915050610d65565b5060008090505b6005811015610ea257600060088281548110610e6557fe5b906000526020600020015490508615610e9057600286029550600081841614610e8f576001860195505b5b86159650508080600101915050610e4d565b5050508080600101915050610d39565b508092505050919050565b8160016000848152602001908152602001600020600001819055508060016000848152602001908152602001600020600101819055506000600160008481526020019081526020016000206002018190555081600260006003548152602001908152602001600020819055506001600354016003819055505050565b6001600082815260200190815260200160002060000154811415610f9257600160008281526020019081526020016000206000808201600090556001820160009055600282016000905550506001600354036003819055505b50565b60008060008060008090505b60035481101561105e57610fb586846110e0565b610fe8876001600060026000878152602001908152602001600020548152602001908152602001600020600101546110e0565b101561105157600060016000600260008581526020019081526020016000205481526020019081526020016000206002015414156110505760016000600260008481526020019081526020016000205481526020019081526020016000206001015492508091505b5b8080600101915050610fa1565b50816002600083815260200190815260200160002054935093505050915091565b8060046000848152602001908152602001600020600101819055506000600460008481526020019081526020016000206004018190555081600560006006548152602001908152602001600020819055506001600654016006819055505050565b6000818314156110f3576000905061117d565b60608061110085856114c2565b80925081935050506000611113836111a8565b90506000611120836111a8565b9050600061112d85610d27565b9050600061113a85610d27565b905060008085851115611151578585039150611157565b84860391505b8383111561116957838303905061116f565b82840390505b808201985050505050505050505b92915050565b6000806001600084815260200190815260200160002060020154905080915050919050565b60008060019050600080905060008090505b84518110156113325760008582815181106111d157fe5b602001015160f81c60f81b9050600080600090505b60098054600181600116156101000203166002900490508110156112c757827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660098281546001816001161561010002031660029004811061124557fe5b8154600116156112645790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156112ba578091506112c7565b80806001019150506111e6565b5060008090505b6005811015611322576000600882815481106112e657fe5b90600052602060002001549050866113105760028602955060008184161461130f576001860195505b5b861596505080806001019150506112ce565b50505080806001019150506111ba565b508092505050919050565b8060046000848152602001908152602001600020600101819055505050565b816004600085815260200190815260200160002060020181905550806004600085815260200190815260200160002060030181905550505050565b7f2df740085e71317ac451dce57ca685ff2946f6b1be05b2add35114a5e1e63126816040518082815260200191505060405180910390a150565b600060016000848152602001908152602001600020600201819055507fd80dcda4b9270200beb859c5af63a5992ab12a6a531137d47b3804e62ef81db7816040518082815260200191505060405180910390a15050565b6000816007819055506007549050919050565b600060016000858152602001908152602001600020600201541461145b57fe5b7fa495e9fee02ccf4d2800ca5b3ddfce556daf13b6f9b479eebbc64019ca11042c83838360405180848152602001838152602001828152602001935050505060405180910390a1600180600085815260200190815260200160002060020181905550505050565b606080600084905060008490506000602060ff16905060008060009050600091505b82821015611567578382602081106114f857fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191685836020811061152a57fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461155a57611567565b81806001019250506114e4565b8160075403905060008090506060826040519080825280601f01601f1916602001820160405280156115a85781602001600182028038833980820191505090505b5090506060836040519080825280601f01601f1916602001820160405280156115e05781602001600182028038833980820191505090505b50905060008590505b60075481101561169e578881602081106115ff57fe5b1a60f81b83858151811061160f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535087816020811061164a57fe5b1a60f81b82858151811061165a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350838060010194505080806001019150506115e9565b5081819950995050505050505050509250929050565b8280548282559060005260206000209081019282156116f0579160200282015b828111156116ef5782518255916020019190600101906116d4565b5b5090506116fd9190611701565b5090565b61172391905b8082111561171f576000816000905550600101611707565b5090565b9056fea265627a7a72315820935b5ca2d89deb9c596f1cf6819d78d243d68c89a8e6086a5c78df48cc09200764736f6c63430005100032"
trafficContract = web3.eth.contract(abi);
web3.eth.estimateGas({data: bytecode})
traffic = trafficContract.new({
    from: web3.eth.accounts[0], 
    data: bytecode, 
    gas: '4000000',
    position:"w2511111111111",
    txtime:277001
  },function (e, contract){
    console.log(e, contract);
    if(!e){
        if(!contract.address) {
            console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
        } else {
            console.log("Contract mined! Address: " + contract.address);
            console.log(contract);
        }
    }
});

同样开始挖矿并留意输出:

miner.start()
/*
-- snip --
null [object Object]
Contract mined! Address: 0xf03dafc4fadae50b1b7bc0f602ae722038f7fe51
[object Object]
-- snip --
*/
miner.stop()  // 停止挖矿以节省电脑性能

这就是StoreTraffic合约的地址了。妥善保存,以供日后使用。

03 上传地图

在仓库的investigation-cjzhuang2020/cjz_underg_2021_09/tree_blockchain路径下找到uploadmap_cjz_3.json文件,打开并修改一下其中的内容:

// -- snip --

// contract address 
var myContractInstance = MyContract.at("StoreMap合约的地址");
var account = "eth.accounts[0]的内容";

// -- snip --

!不明晰点!后续的步骤中出现错误(浏览器中console打印的roads数组的元素中path数组为空),怀疑是上传地图有问题。

解决方法:investigation-cjzhuang2020/cjz_underg_2021_09/tree_blockchain/build下有一个StoreMap.json,换成我们使用Truffle编译获得的json即可。

令区块链开始挖矿之后,使用node运行一下这个脚本。终端中不断输出,直至出现“地图数据上传完成”字样。停止挖矿。

04 更改文件以加入账户信息

目前,我们已经创建了8个账户(详见00节中的“创建账户”指令)。接下来,我们修改一些文件的内容,让这8个账户中的其中一个作为车辆的账户,一个作为乘客的账户。后续的自动化测试脚本,将会调用我们在本节修改的文件。

在仓库的investigation-cjzhuang2020/cjz_underg_2021_09路径下,找到如下文件并修改之:

passengerAccounts.py

将其改为:

passengers = ["eth.accounts[0]的内容"]

vehicleAccounts.py

将其改为:

vehicles = ["eth.accounts[1]的内容"]

mapContract.js

将其改为:

var mapContractAddress = "StoreMap合约的地址";
// --snip--

trafficContract.js

将其改为:

var trafficContractAddress = "StoreTraffic合约的地址";

passengers.js

将其改为:

let passengers = [
    {
        passengerId: "eth.accounts[0]的内容",
        passengerPosition: "wx4er3tvs9s",
        passengerStart: "wx4er2juseu",
        passengerEnd: "wx4g200hxgf",
    }
    // {
    //     passengerId: "0xbae4e5086ea1c75d20e9771de4b4252af4adc406",
    //     passengerPosition: "wx4er2juseu",
    //     passengerStart: "wx4epqtgstu",
    //     passengerEnd: "wx4g0n85xvf",
    // },
    // {
    //     passengerId: "0xecfc0932a92863f7c6444fb3aaff69856a189b59",
    //     passengerPosition: "wx4epqtgstu",
    //     passengerStart: "wx4epmjfu8h",
    //     passengerEnd: "wx4g0j04zb4",
    // },
    // {
    //     passengerId: "0xd382727be67e57fe18e0401fcf39686b5063ed55",
    //     passengerPosition: "wx4epmjfu8h",
    //     passengerStart: "wx4ep7tcudh",
    //     passengerEnd: "wx4g0581zf4",
    // },
]

vehicles.js

将其改为:

let vehicles = [
    { "vehicleId": "eth.accounts[1]的内容", "vehiclePosition": "wx4enge9c6j" }
    // { "vehicleId": "0x7c1e3c84f6eb6736181eb3edd7e8685ff960fe35", "vehiclePosition": "wx4env5dc2j" },
    // { "vehicleId": "0xf0efa2e97b9caf2155a973b30d11a36893e8988d", "vehiclePosition": "wx4enyee9mv" },
    // { "vehicleId": "0x471882a68b4fcce65aa8a12e77b6934adbe89aed", "vehiclePosition": "wx4eqb5s97v" }
]

05 启动测试

在《7 调度系统复现》文档中,我们发现了自动测试脚本中的错误并予以更正。为使所有跳过了《7 调度系统复现》文档的读者能够顺利进行实验,笔者将再复述一次修正错误的方法:

问题1

报错:selenium没有叫做find_element_by_id的属性。

解决方法:将所有find_element_by_id(...)替换为find_element(by=By.id, value=...)。另外,也将所有find_element_by_class_name(...)换成find_element(by=By.CLASS_NAME, value=...)

问题2

遇到这个错误:selenium.common.exceptions.TimeoutException。很明显,是由于网页没有按照期望的方式运行,导致wait_until超时,进而引发了该错误。

检查vehicle_test.py所打开的前端页面sys_vehicle_region.html,发现其WeSocket连接的端口是8548,并非我们使用的8546(这是因为01节中给出的node = childProcess.exec(...)中给出的代码中,有一个--wsport 8546参数)。将其改为:

// ...
const PORT = 8546;
// ...
web3Map = new Web3(new Web3.providers.WebsocketProvider(`ws://127.0.0.1:${PORT}`));
web3Traffic = new Web3(new Web3.providers.WebsocketProvider(`ws://127.0.0.1:${PORT}`));

让我们继续。。。

全部更改完毕之后,启动挖矿,准备启动车辆客户端和乘客端的测试脚本。

investigation-cjzhuang2020/cjz_underg_2021_09中启动终端,执行:

python3 vehicle_test.py

!不明晰点!打开了Googe Chrome,但地图还是全白,且控制台中输出的roads数组的元素中,path还是空的。。。

解决方法:详见03节上传地图一章!

看到如下提示,说明车辆位置上传成功:

image-20221201224614786

接下来启动乘客测试脚本:

python3 passenger_test.py

selenium控制的浏览器会进行一系列的操作,当司机端询问:Whether to pick up the passenger时,点按下图的pickUp按钮接起乘客,即可完成后续的调度步骤:

image-20221201225025433

最终,乘客被送达目的地,并在支付订单之后乘客端的测试程序结束运行:

image-20221201225050608

image-20221201225158140

本次实验圆满结束。至此,全部复现实验已经完成。