Commit f8e5e02a authored by shajiaiming's avatar shajiaiming

跨链优化

parent ee6e91d8
...@@ -32,33 +32,26 @@ class CrossChainController extends BaseController ...@@ -32,33 +32,26 @@ class CrossChainController extends BaseController
$data['address'] = $post['address']; $data['address'] = $post['address'];
$data['transfer_number'] = date('YmdHis') . self::getrandnums(); $data['transfer_number'] = date('YmdHis') . self::getrandnums();
$model = CoinCrossChain::find()->where(['address' => $post['address'], 'current_step' => CoinCrossChain::STEP_DEFAULT, 'is_with_draw' => CoinCrossChain::RECHARGE])->one(); $isExist = CoinCrossChain::find()
if ($model) { ->where(['address' => $post['address'], 'is_with_draw' => CoinCrossChain::RECHARGE])
->andWhere(['query_result' => '0'])
->asArray()->all();
if ($isExist) {
$msg = '存在未完成的交易!'; $msg = '存在未完成的交易!';
goto doEnd; goto doEnd;
} }
$model = new CoinCrossChain();
foreach ($post['txs'] as $key => $val) { foreach ($post['txs'] as $key => $val) {
if (1 == $val['step']) { $model = new CoinCrossChain();
$seq = 'first'; $data['txhex'] = $val['tx'];
} else if (2 == $val['step']) { $data['transfer_url'] = $val['url'];
$seq = 'second'; $model->load($data, '');
} else { $model->save();
$seq = 'first';
}
$data['txhex_' . $seq] = $val['tx'];
$data['transfer_url_' . $seq] = $val['url'];
}
$model->setScenario(CoinCrossChain::SCENARIOS_CREATE);
if ($model->load($data, '') && $model->save()) {
$msg = 'success';
$code = 0;
} else {
$msg = current($model->firstErrors);
} }
$code = 0;
$msg = 'success';
doEnd : doEnd :
return ['code' => $code, 'msg' => $msg]; return ['code' => $code, 'msg' => $msg];
} }
...@@ -82,37 +75,78 @@ class CrossChainController extends BaseController ...@@ -82,37 +75,78 @@ class CrossChainController extends BaseController
goto doEnd; goto doEnd;
} }
$model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(1)->asArray()->one(); $model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(2)->asArray()->all();
if (empty($model)) { if (empty($model)) {
$msg = '数据不存在!'; $msg = '数据不存在!';
goto doEnd; goto doEnd;
} }
sort($model);
if (false == $model['txhash'] && false == $model['msg']) {
$data = [ $step = 0;
'step' => $model['current_step'] foreach ($model as $key => $val) {
]; if (0 == $key) {
$code = 0; if (false == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$msg = '交易尚未执行'; $data = [
goto doEnd; 'step' => $key
} ];
$code = 0;
if (false == $model['txhash'] && false != $model['msg']) { $msg = '第一笔交易尚未执行';
$data = [ goto doEnd;
'step' => $model['current_step'] }
]; if (true == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$msg = $model['msg']; $data = [
goto doEnd; 'step' => $key + 1
} ];
$code = 0;
if (true == $model['txhash'] && false == $model['msg']) { $msg = $val['send_result'];
$data = [ goto doEnd;
'step' => $model['current_step'] }
]; if (false == $val['send_result'] && false == $val['query_result'] && true == $val['msg']) {
$code = 0; $data = [
$msg = $model['txhash']; 'step' => $key + 1
goto doEnd; ];
$code = -1;
$msg = $val['msg'];
goto doEnd;
}
if (true == $val['send_result'] && true == $val['query_result'] && false == $val['msg']) {
continue;
}
}
if (1 == $key) {
if (false == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = 0;
$msg = '第二笔交易尚未执行';
goto doEnd;
}
if (true == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = 0;
$msg = $val['send_result'];
goto doEnd;
}
if (false == $val['send_result'] && false == $val['query_result'] && true == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = -1;
$msg = $val['msg'];
goto doEnd;
}
if (true == $val['send_result'] && true == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => 3
];
$code = 0;
$msg = $val['send_result'];
goto doEnd;
}
}
} }
doEnd : doEnd :
......
...@@ -7,11 +7,6 @@ use common\core\BaseActiveRecord; ...@@ -7,11 +7,6 @@ use common\core\BaseActiveRecord;
class CoinCrossChain extends BaseActiveRecord class CoinCrossChain extends BaseActiveRecord
{ {
const STEP_DEFAULT = 0;
const STEP_FIRST = 1;
const STEP_SECOND = 2;
const STEP_THRID = 3;
const WITHDRAW = 0; const WITHDRAW = 0;
const RECHARGE = 1; const RECHARGE = 1;
...@@ -22,7 +17,7 @@ class CoinCrossChain extends BaseActiveRecord ...@@ -22,7 +17,7 @@ class CoinCrossChain extends BaseActiveRecord
public static function tableName() public static function tableName()
{ {
return '{{%coin_cross_chain}}'; return '{{%coin_cross_chain_transfer}}';
} }
//定义场景 //定义场景
...@@ -32,7 +27,7 @@ class CoinCrossChain extends BaseActiveRecord ...@@ -32,7 +27,7 @@ class CoinCrossChain extends BaseActiveRecord
public function rules() public function rules()
{ {
return [ return [
[['is_with_draw', 'address', 'txhex_first', 'transfer_url_first', 'txhex_second', 'transfer_url_second'], 'required'], [['is_with_draw', 'address', 'txhex', 'transfer_url'], 'required'],
['transfer_number', 'safe'] ['transfer_number', 'safe']
]; ];
} }
...@@ -40,7 +35,7 @@ class CoinCrossChain extends BaseActiveRecord ...@@ -40,7 +35,7 @@ class CoinCrossChain extends BaseActiveRecord
public function scenarios() public function scenarios()
{ {
$scenarios = [ $scenarios = [
self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex_first', 'transfer_url_first', 'txhex_second', 'transfer_url_second', 'transfer_number'], self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex', 'transfer_url', 'transfer_number'],
]; ];
return array_merge(parent:: scenarios(), $scenarios); return array_merge(parent:: scenarios(), $scenarios);
} }
......
...@@ -234,6 +234,14 @@ class Chain33Service ...@@ -234,6 +234,14 @@ class Chain33Service
return $this->send($params, 'Chain33.SendTransaction'); return $this->send($params, 'Chain33.SendTransaction');
} }
public function QueryTransaction($data)
{
$params = [
'hash' => $data
];
return $this->send($params, 'Chain33.QueryTransaction');
}
public function getBalance($address, $execer) public function getBalance($address, $execer)
{ {
$params = [ $params = [
......
...@@ -16,7 +16,7 @@ class CrossChainController extends Controller ...@@ -16,7 +16,7 @@ class CrossChainController extends Controller
*/ */
public function actionAutoTransfer() public function actionAutoTransfer()
{ {
$model = CoinCrossChain::find()->where(['txhash' => "0"])->limit(20)->asArray()->all(); $model = CoinCrossChain::find()->where(['send_result' => "0"])->limit(20)->groupBy('transfer_number')->orderBy('id')->asArray()->all();
if (empty($model)) { if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL; echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0; return 0;
...@@ -25,18 +25,7 @@ class CrossChainController extends Controller ...@@ -25,18 +25,7 @@ class CrossChainController extends Controller
foreach ($model as $val) { foreach ($model as $val) {
// go(function () use ($val) { // go(function () use ($val) {
// \Co::sleep(0.5); // \Co::sleep(0.5);
if (1 == $val['current_step']) { $node_params = $val['transfer_url'];
$seq = 'first';
$step = 1;
} else if (2 == $val['current_step']) {
$seq = 'second';
$step = 2;
} else {
$seq = 'first';
$step = 1;
}
$node_params = $val['transfer_url_' . $seq];
$node_params = explode(':', $node_params); $node_params = explode(':', $node_params);
$node_params = [ $node_params = [
'scheme' => $node_params[0], 'scheme' => $node_params[0],
...@@ -44,28 +33,66 @@ class CrossChainController extends Controller ...@@ -44,28 +33,66 @@ class CrossChainController extends Controller
'port' => $node_params[2] 'port' => $node_params[2]
]; ];
$service = new Chain33Service($node_params); $service = new Chain33Service($node_params);
$sign_str = $val['txhex_' . $seq]; $sign_str = $val['txhex'];
$result = $service->sendTransaction($sign_str); $result = $service->sendTransaction($sign_str);
if (0 != $result['code']) { if (0 != $result['code']) {
$txhash = '0';
$msg = $result['msg']; $msg = $result['msg'];
goto doEnd; goto doEnd;
} }
$txhash = $result['result']; $send_result = $result['result'];
$msg = 'success';
$step = ($step + 1 > 2) ? 2 : ($step + 1);
doEnd : doEnd :
$current_step = $step;
$currentModel = CoinCrossChain::findOne($val['id']); $currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->current_step = $current_step; if (isset($msg)) {
$currentModel->txhash = $txhash; $currentModel->msg = $msg;
$currentModel->msg = $msg; }
if (isset($send_result)) {
$currentModel->send_result = $send_result;
}
$currentModel->save(); $currentModel->save();
// }); // });
} }
return 0; return 0;
} }
public function actionQueryTransaction()
{
$model = CoinCrossChain::find()->where(['<>', 'send_result', '0'])->limit(20)->asArray()->all();
if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0;
}
foreach ($model as $val) {
$node_params = $val['transfer_url'];
$node_params = explode(':', $node_params);
$node_params = [
'scheme' => $node_params[0],
'host' => str_replace('//', '', $node_params[1]),
'port' => $node_params[2]
];
$service = new Chain33Service($node_params);
$send_result = $val['send_result'];
$result = $service->QueryTransaction($send_result);
if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) {
$query_result = 'success';
$msg = 'success';
} else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) {
$query_result = 'success';
$msg = 'success';
} else {
$query_result = 'fail';
$msg = $result['result']['receipt']['logs'][0]['log'];
}
$currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->query_result = $query_result;
$currentModel->msg = $msg;
$currentModel->save();
}
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment